PageRenderTime 90ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/src/main/java/com/dzhou/corejava/leetcode/old/LeetCode.java

https://github.com/davidhuizhou/Corejava
Java | 6293 lines | 4160 code | 1266 blank | 867 comment | 1795 complexity | 27a97661ff553b8b943a5f23a2267846 MD5 | raw file
  1. package com.dzhou.corejava.leetcode.old;
  2. import com.dzhou.corejava.crackingthecode.LinkedListNode;
  3. import com.dzhou.corejava.leetcode.ListNode;
  4. import com.dzhou.corejava.leetcode.TreeLinkNode;
  5. import com.dzhou.corejava.leetcode.TreeNode;
  6. import com.dzhou.util.StringUtils;
  7. import java.util.*;
  8. /**
  9. * Created by huizhou on 7/15/14.
  10. */
  11. public class LeetCode {
  12. /**
  13. * http://www.programcreek.com/2012/12/leetcode-solution-of-two-sum-in-java/
  14. * https://oj.leetcode.com/submissions/detail/9009004/
  15. */
  16. public static int[] twoSum(int[] numbers, int target) {
  17. int[] result = {-1, -1};
  18. if (numbers == null)
  19. return result;
  20. HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
  21. for (int i = 0; i < numbers.length; i++) {
  22. if (map.containsKey(numbers[i])) {
  23. result[0] = map.get(numbers[i]) + 1;
  24. result[1] = i + 1;
  25. break;
  26. } else {
  27. map.put(target - numbers[i], i);
  28. }
  29. }
  30. return result;
  31. }
  32. /**
  33. * https://oj.leetcode.com/problems/median-of-two-sorted-arrays/
  34. * https://oj.leetcode.com/submissions/detail/9009719/
  35. */
  36. public static double findMedianSortedArrays(int A[], int B[]) {
  37. int aLen = A.length;
  38. int bLen = B.length;
  39. int len = aLen + bLen;
  40. if (len % 2 == 0)
  41. return (kthElement(A, B, len / 2 - 1, 0, aLen - 1, 0, bLen - 1)
  42. + kthElement(A, B, len / 2, 0, aLen - 1, 0, bLen - 1)) * 0.5;
  43. else
  44. return kthElement(A, B, len / 2, 0, aLen - 1, 0, bLen - 1);
  45. }
  46. private static int kthElement(int[] A, int[] B, int k, int aStart, int aEnd, int bStart, int bEnd) {
  47. int aLen = aEnd - aStart + 1;
  48. int bLen = bEnd - bStart + 1;
  49. if (aLen <= 0 || A.length <= 0)
  50. return B[bStart + k];
  51. if (bLen <= 0 || B.length <= 0)
  52. return A[aStart + k];
  53. if (k == 0)
  54. return Math.min(A[aStart + k], B[bStart + k]);
  55. int aMid = k * aLen / (aLen + bLen);
  56. int bMid = k - aMid - 1;
  57. aMid = aStart + aMid;
  58. bMid = bStart + bMid;
  59. if (A[aMid] >= B[bMid]) {
  60. k = k - (bMid - bStart + 1);
  61. aEnd = aMid;
  62. bStart = bMid + 1;
  63. } else {
  64. k = k - (aMid - aStart + 1);
  65. bEnd = bMid;
  66. aStart = aMid + 1;
  67. }
  68. return kthElement(A, B, k, aStart, aEnd, bStart, bEnd);
  69. }
  70. /**
  71. * https://oj.leetcode.com/problems/longest-substring-without-repeating-characters/
  72. * https://oj.leetcode.com/submissions/detail/9010153/
  73. */
  74. public static int lengthOfLongestSubstring(String s) {
  75. if (s == null)
  76. return 0;
  77. if (s.length() <= 1)
  78. return s.length();
  79. int longest = 1;
  80. int i = 0;
  81. int j = 1;
  82. for (j = 1; j < s.length(); j++) {
  83. int index = s.substring(i, j).indexOf(s.charAt(j));
  84. if (index >= 0) {
  85. if (j - i > longest)
  86. longest = j - i;
  87. i = i + index + 1;
  88. }
  89. }
  90. if (j - i > longest)
  91. longest = j - i;
  92. return longest;
  93. }
  94. /**
  95. * https://oj.leetcode.com/problems/add-two-numbers/
  96. * https://oj.leetcode.com/submissions/detail/9011366/
  97. */
  98. public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
  99. ListNode sentinel = new ListNode(0);
  100. ListNode p = sentinel;
  101. int carry = 0;
  102. while (l1 != null || l2 != null) {
  103. if (l1 != null) {
  104. carry += l1.val;
  105. l1 = l1.next;
  106. }
  107. if (l2 != null) {
  108. carry += l2.val;
  109. l2 = l2.next;
  110. }
  111. ListNode n = new ListNode(carry % 10);
  112. p.next = n;
  113. p = n;
  114. carry /= 10;
  115. }
  116. if (carry == 1) {
  117. p.next = new ListNode(carry);
  118. }
  119. return sentinel.next;
  120. }
  121. /**
  122. * https://oj.leetcode.com/problems/longest-palindromic-substring/
  123. * https://oj.leetcode.com/submissions/detail/9012368/
  124. */
  125. public static String longestPalindrome(String s) {
  126. if (s == null)
  127. return null;
  128. if (s.length() == 1)
  129. return s;
  130. String longest = s.substring(0, 1);
  131. for (int i = 0; i <= s.length() - 2; i++) {
  132. String pStr = expend(s, i, i);
  133. String qStr = expend(s, i, i + 1);
  134. if (pStr.length() > longest.length())
  135. longest = pStr;
  136. if (qStr.length() > longest.length())
  137. longest = qStr;
  138. }
  139. return longest;
  140. }
  141. private static String expend(String s, int i, int j) {
  142. if (s == null || i < 0 || i > s.length() - 1 || j < 0 || j > s.length() - 1 || i > j || s.charAt(i) != s.charAt(j))
  143. return "";
  144. while (i >= 0 && j < s.length() && s.charAt(i) == s.charAt(j)) {
  145. i--;
  146. j++;
  147. }
  148. return s.substring(i + 1, j);
  149. }
  150. public static Set<String> longestPalindromSubStrings1(String s) {
  151. Set<String> results = new HashSet<String>();
  152. if (s.isEmpty())
  153. return null;
  154. if (s.length() == 1) {
  155. results.add(s);
  156. return results;
  157. }
  158. int longest = 1;
  159. for (int i = 0; i < s.length(); i++) {
  160. String l = expend(s, i, i);
  161. if (l.length() == longest) {
  162. results.add(l);
  163. } else if (l.length() > longest) {
  164. results.clear();
  165. results.add(l);
  166. longest = l.length();
  167. }
  168. l = expend(s, i, i + 1);
  169. if (l.length() == longest) {
  170. results.add(l);
  171. } else if (l.length() > longest) {
  172. results.clear();
  173. results.add(l);
  174. longest = l.length();
  175. }
  176. }
  177. return results;
  178. }
  179. /**
  180. * https://oj.leetcode.com/problems/reverse-integer/
  181. * https://oj.leetcode.com/submissions/detail/9012870/
  182. */
  183. public static int reverse(int x) {
  184. int sign = 1;
  185. if (x < 0) {
  186. sign = -1;
  187. x = x * (-1);
  188. }
  189. int result = 0;
  190. while (x > 0) {
  191. result = 10 * result + x % 10;
  192. x /= 10;
  193. }
  194. return sign * result;
  195. }
  196. /**
  197. * http://www.programcreek.com/2012/12/leetcode-string-to-integer-atoi/
  198. * https://oj.leetcode.com/submissions/detail/9014031/
  199. */
  200. public static int atoi(String str) {
  201. if (str == null || str.trim().length() == 0)
  202. return 0;
  203. str = str.trim();
  204. int sign = 1;
  205. int i = 0;
  206. if (str.charAt(0) == '+') {
  207. i++;
  208. }
  209. if (str.charAt(0) == '-') {
  210. sign = -1;
  211. i++;
  212. }
  213. double result = 0.0;
  214. while (i < str.length() && str.charAt(i) >= '0' && str.charAt(i) <= '9') {
  215. result = 10.0 * result + (str.charAt(i) - '0');
  216. i++;
  217. }
  218. result = sign * result;
  219. if (result >= Integer.MAX_VALUE)
  220. return Integer.MAX_VALUE;
  221. if (result <= Integer.MIN_VALUE)
  222. return Integer.MIN_VALUE;
  223. return (int) result;
  224. }
  225. /**
  226. * https://oj.leetcode.com/problems/palindrome-number/
  227. * https://oj.leetcode.com/submissions/detail/9014691/
  228. */
  229. public static boolean isPalindrome(int x) {
  230. if (x < 0)
  231. return false;
  232. if (x < 10)
  233. return true;
  234. int div = 10;
  235. while (x / div >= 10)
  236. div *= 10;
  237. while (div >= 10) {
  238. int left = x / div;
  239. int right = x % 10;
  240. if (left != right)
  241. return false;
  242. x = (x % div) / 10;
  243. div /= 100;
  244. }
  245. return true;
  246. }
  247. /**
  248. * https://oj.leetcode.com/problems/regular-expression-matching/
  249. * https://oj.leetcode.com/submissions/detail/9016055/
  250. */
  251. public static boolean isMatch(String s, String p) {
  252. if (s == null)
  253. return p == null;
  254. if (p == null)
  255. return s == null;
  256. if (p.length() == 0)
  257. return s.length() == 0;
  258. if (p.length() == 1 || p.charAt(1) != '*') {
  259. if (s.length() < 1 || (p.charAt(0) != '.' && p.charAt(0) != s.charAt(0)))
  260. return false;
  261. return isMatch(s.substring(1), p.substring(1));
  262. } else {
  263. int i = -1;
  264. while (i < s.length() && (i < 0 || p.charAt(0) == '.' || p.charAt(0) == s.charAt(i))) {
  265. if (isMatch(s.substring(i + 1), p.substring(2)))
  266. return true;
  267. i++;
  268. }
  269. return false;
  270. }
  271. }
  272. /**
  273. * https://oj.leetcode.com/problems/longest-common-prefix/
  274. * https://oj.leetcode.com/submissions/detail/9113380/
  275. */
  276. public static String longestCommonPrefix(String[] strs) {
  277. if (strs.length == 0)
  278. return "";
  279. String s = strs[0];
  280. int lo = 0, hi = s.length() - 1;
  281. while (lo <= hi) {
  282. int mid = lo + (hi - lo) / 2;
  283. if (isCommonPrefix(s.substring(lo, hi + 1), strs, lo))
  284. break;
  285. else if (isCommonPrefix(s.substring(lo, mid + 1), strs, lo))
  286. lo = mid + 1;
  287. else
  288. hi = mid - 1;
  289. }
  290. if (hi >= 0)
  291. return s.substring(0, hi + 1);
  292. else
  293. return "";
  294. }
  295. private static boolean isCommonPrefix(String s, String[] strs, int start) {
  296. for (String str : strs) {
  297. if (str.substring(start).indexOf(s) != 0)
  298. return false;
  299. }
  300. return true;
  301. }
  302. /**
  303. * https://oj.leetcode.com/problems/3sum/
  304. * https://oj.leetcode.com/submissions/detail/9259432/
  305. */
  306. public static List<List<Integer>> threeSum(int[] num) {
  307. Set<List<Integer>> set = new HashSet<List<Integer>>();
  308. Arrays.sort(num);
  309. for (int i = 0; i <= num.length - 3; i++) {
  310. int j = i + 1, k = num.length - 1;
  311. while (j < k) {
  312. int sum = num[i] + num[j] + num[k];
  313. if (sum < 0) {
  314. j++;
  315. } else if (sum > 0) {
  316. k--;
  317. } else {
  318. List<Integer> r = new ArrayList<Integer>();
  319. r.add(num[i]);
  320. r.add(num[j]);
  321. r.add(num[k]);
  322. set.add(r);
  323. j++;
  324. k--;
  325. }
  326. }
  327. }
  328. List<List<Integer>> result = new ArrayList<List<Integer>>();
  329. for (List<Integer> s : set) {
  330. result.add(s);
  331. }
  332. return result;
  333. }
  334. /**
  335. * https://oj.leetcode.com/problems/3sum-closest/
  336. * https://oj.leetcode.com/submissions/detail/9260441/
  337. */
  338. public static int threeSumClosest(int[] num, int target) {
  339. Arrays.sort(num);
  340. int min = Integer.MAX_VALUE;
  341. int result = 0;
  342. for (int i = 0; i <= num.length - 3; i++) {
  343. int j = i + 1;
  344. int k = num.length - 1;
  345. while (j < k) {
  346. int sum = num[i] + num[j] + num[k];
  347. int diff = Math.abs(sum - target);
  348. if (diff < min) {
  349. min = diff;
  350. result = sum;
  351. }
  352. if (sum == target) {
  353. return sum;
  354. } else if (sum < target) {
  355. j++;
  356. } else {
  357. k--;
  358. }
  359. }
  360. }
  361. return result;
  362. }
  363. /**
  364. * https://oj.leetcode.com/problems/swap-nodes-in-pairs/
  365. * https://oj.leetcode.com/submissions/detail/9273396/
  366. */
  367. public ListNode swapPairs(ListNode head) {
  368. if (head == null)
  369. return head;
  370. ListNode p = head;
  371. while (p != null) {
  372. ListNode q = p.next;
  373. if (q != null) {
  374. int temp = p.val;
  375. p.val = q.val;
  376. q.val = temp;
  377. p = q.next;
  378. } else {
  379. break;
  380. }
  381. }
  382. return head;
  383. }
  384. /**
  385. * https://oj.leetcode.com/problems/4sum/
  386. * https://oj.leetcode.com/problems/4sum/
  387. */
  388. public static List<List<Integer>> fourSum(int[] num, int target) {
  389. Set<List<Integer>> set = new HashSet<List<Integer>>();
  390. Arrays.sort(num);
  391. for (int i = 0; i <= num.length - 4; i++) {
  392. for (int j = i + 1; j <= num.length - 3; j++) {
  393. int m = j + 1;
  394. int n = num.length - 1;
  395. while (m < n) {
  396. int sum = num[i] + num[j] + num[m] + num[n];
  397. if (sum == target) {
  398. List<Integer> l = new ArrayList<Integer>();
  399. l.add(num[i]);
  400. l.add(num[j]);
  401. l.add(num[m]);
  402. l.add(num[n]);
  403. set.add(l);
  404. m++;
  405. n--;
  406. } else if (sum < target) {
  407. m++;
  408. } else {
  409. n--;
  410. }
  411. }
  412. }
  413. }
  414. List<List<Integer>> result = new ArrayList<List<Integer>>();
  415. for (List<Integer> s : set) {
  416. result.add(s);
  417. }
  418. return result;
  419. }
  420. /**
  421. * https://oj.leetcode.com/problems/remove-nth-node-from-end-of-list/
  422. * https://oj.leetcode.com/submissions/detail/9265681/
  423. */
  424. public ListNode removeNthFromEnd(ListNode head, int n) {
  425. if (head == null)
  426. return head;
  427. if (n <= 0)
  428. return head;
  429. ListNode p = head;
  430. ListNode q = head;
  431. int count = 0;
  432. for (int i = 0; i <= n - 1 && q != null; i++) {
  433. q = q.next;
  434. count++;
  435. }
  436. if (count < n)
  437. return head;
  438. else {
  439. if (q == null)
  440. return head.next;
  441. else {
  442. while (q.next != null) {
  443. p = p.next;
  444. q = q.next;
  445. }
  446. if (p.next != null)
  447. p.next = p.next.next;
  448. }
  449. }
  450. return head;
  451. }
  452. /**
  453. * https://oj.leetcode.com/problems/valid-parentheses/
  454. * https://oj.leetcode.com/submissions/detail/9269784/
  455. */
  456. public boolean isValid(String s) {
  457. Stack<Character> stack = new Stack<Character>();
  458. for (int i = 0; i < s.length(); i++) {
  459. char c = s.charAt(i);
  460. if (c == '{' || c == '(' || c == '[')
  461. stack.push(c);
  462. else if (c == '}' && (stack.isEmpty() || stack.pop() != '{')) {
  463. return false;
  464. } else if (c == ')' && (stack.isEmpty() || stack.pop() != '(')) {
  465. return false;
  466. } else if (c == ']' && (stack.isEmpty() || stack.pop() != '[')) {
  467. return false;
  468. }
  469. }
  470. return stack.isEmpty();
  471. }
  472. /**
  473. * https://oj.leetcode.com/problems/generate-parentheses/
  474. * https://oj.leetcode.com/submissions/detail/9270187/
  475. */
  476. public static List<String> generateParenthesis(int n) {
  477. List<String> parenthesis = new ArrayList<String>();
  478. if (n == 0) {
  479. parenthesis.add("");
  480. return parenthesis;
  481. }
  482. generateParenthesisHelper(parenthesis, n, 0, 0, "");
  483. return parenthesis;
  484. }
  485. private static void generateParenthesisHelper(List<String> parenthesis, int n, int left, int right, String s) {
  486. if (left == n) {
  487. for (int i = 0; i < n - right; i++)
  488. s += ")";
  489. parenthesis.add(s);
  490. } else if (left > right) {
  491. generateParenthesisHelper(parenthesis, n, left + 1, right, s + "(");
  492. generateParenthesisHelper(parenthesis, n, left, right + 1, s + ")");
  493. } else if (left == right) {
  494. generateParenthesisHelper(parenthesis, n, left + 1, right, s + "(");
  495. }
  496. }
  497. /**
  498. * https://oj.leetcode.com/problems/merge-k-sorted-lists/
  499. * https://oj.leetcode.com/submissions/detail/9271178/
  500. */
  501. public ListNode mergeKLists(List<ListNode> lists) {
  502. if (lists == null)
  503. return null;
  504. PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
  505. for (ListNode node : lists) {
  506. while (node != null) {
  507. pq.add(node.val);
  508. node = node.next;
  509. }
  510. }
  511. ListNode res = new ListNode(0);
  512. ListNode tail = res;
  513. while (!pq.isEmpty()) {
  514. tail.next = new ListNode(pq.poll());
  515. tail = tail.next;
  516. }
  517. return res.next;
  518. }
  519. /**
  520. * https://oj.leetcode.com/problems/reverse-nodes-in-k-group/
  521. * https://oj.leetcode.com/submissions/detail/9355999/
  522. */
  523. public ListNode reverseKGroup(ListNode head, int k) {
  524. if (head == null || k <= 1)
  525. return head;
  526. int count = 0;
  527. ListNode p = head;
  528. while (count < k && p != null) {
  529. count++;
  530. p = p.next;
  531. }
  532. if (count < k)
  533. return head;
  534. p = head;
  535. ListNode q = head;
  536. ListNode r = null;
  537. for (int i = 0; i < k; i++) {
  538. p = p.next;
  539. q.next = r;
  540. r = q;
  541. q = p;
  542. }
  543. head.next = reverseKGroup(p, k);
  544. return r;
  545. }
  546. /**
  547. * https://oj.leetcode.com/problems/remove-duplicates-from-sorted-array/
  548. * https://oj.leetcode.com/submissions/detail/9356997/
  549. */
  550. public static int removeDuplicates(int[] A) {
  551. if (A.length <= 1)
  552. return A.length;
  553. int k = 0;
  554. for (int i = 1; i < A.length; i++) {
  555. if (A[i] != A[k])
  556. A[++k] = A[i];
  557. }
  558. return k + 1;
  559. }
  560. /**
  561. * https://oj.leetcode.com/problems/remove-duplicates-from-sorted-array-ii/
  562. * https://oj.leetcode.com/submissions/detail/10762488/
  563. *
  564. */
  565. public static int removeDuplicates2(int[] A) {
  566. if (A.length <= 2)
  567. return A.length;
  568. int k = 1;
  569. for (int i = 2; i < A.length; i++) {
  570. if (!(A[i] == A[k] && A[i] == A[k-1]))
  571. A[++k] = A[i];
  572. }
  573. return k + 1;
  574. }
  575. /**
  576. * https://oj.leetcode.com/problems/remove-element/
  577. * https://oj.leetcode.com/submissions/detail/9357121/
  578. */
  579. public int removeElement(int[] A, int elem) {
  580. int i = 0, j = 0;
  581. while (j < A.length) {
  582. if (A[j] != elem) {
  583. A[i] = A[j];
  584. i++;
  585. }
  586. j++;
  587. }
  588. return i;
  589. }
  590. /**
  591. * https://oj.leetcode.com/problems/implement-strstr/
  592. * https://oj.leetcode.com/submissions/
  593. */
  594. public static String strStr(String haystack, String needle) {
  595. if (haystack == null || needle == null)
  596. return null;
  597. int haystackLen = haystack.length();
  598. int needleLen = needle.length();
  599. if (haystackLen < needleLen)
  600. return null;
  601. if (needleLen == 0)
  602. return haystack;
  603. for (int i = 0; i <= haystackLen - needleLen; i++) {
  604. int j = 0;
  605. while (j < needleLen && i + j < haystackLen
  606. && needle.charAt(j) == haystack.charAt(i + j))
  607. j++;
  608. if (j == needleLen)
  609. return haystack.substring(i);
  610. }
  611. return null;
  612. }
  613. public static String strStr2(String haystack, String needle) {
  614. int needleLen = needle.length();
  615. int haystackLen = haystack.length();
  616. if (needleLen == haystackLen && needleLen == 0)
  617. return "";
  618. if (needleLen == 0)
  619. return haystack;
  620. for (int i = 0; i < haystackLen; i++) {
  621. // make sure in boundary of needle
  622. if (haystackLen - i + 1 < needleLen)
  623. return null;
  624. int k = i;
  625. int j = 0;
  626. while (j < needleLen && k < haystackLen && needle.charAt(j) == haystack.charAt(k)) {
  627. j++;
  628. k++;
  629. if (j == needleLen)
  630. return haystack.substring(i);
  631. }
  632. }
  633. return null;
  634. }
  635. /**
  636. * https://oj.leetcode.com/problems/divide-two-integers/
  637. * https://oj.leetcode.com/submissions/detail/9400097/
  638. */
  639. public static int divide(int dividend, int divisor) {
  640. int result = 0;
  641. int sign = 1;
  642. long lDividend = dividend;
  643. long lDivisor = divisor;
  644. if (dividend == 0)
  645. return 0;
  646. if (divisor == 1)
  647. return dividend;
  648. if (dividend < 0) {
  649. sign = 0 - sign;
  650. lDividend = 0 - lDividend;
  651. }
  652. if (divisor < 0) {
  653. sign = 0 - sign;
  654. lDivisor = 0 - lDivisor;
  655. }
  656. while (lDividend >= lDivisor) {
  657. long mDivisor = lDivisor;
  658. int factor = 0;
  659. while (mDivisor <= lDividend && mDivisor > 0) {
  660. mDivisor = mDivisor << 1;
  661. factor++;
  662. }
  663. factor--;
  664. result += (1 << factor);
  665. lDividend -= (lDivisor << factor);
  666. }
  667. if (sign == -1)
  668. result = 0 - result;
  669. return result;
  670. }
  671. private static void permute(Set<String> result, String[] L, String p, int count, int total) {
  672. if (count == total)
  673. result.add(p);
  674. if (L == null)
  675. return;
  676. int l = L.length;
  677. if (l == 0)
  678. return;
  679. else {
  680. for (int i = 0; i < l; i++) {
  681. String w = L[i];
  682. String[] temp = new String[l - 1];
  683. for (int j = 0; j < i; j++)
  684. temp[j] = L[j];
  685. for (int j = i; j < l - 1; j++)
  686. temp[j] = L[j + 1];
  687. permute(result, temp, p + w, count + 1, total);
  688. }
  689. }
  690. }
  691. /**
  692. * https://oj.leetcode.com/problems/substring-with-concatenation-of-all-words/
  693. * https://oj.leetcode.com/submissions/detail/9464973/
  694. */
  695. public static List<Integer> findSubstring(String S, String[] L) {
  696. List<Integer> result = new ArrayList<Integer>();
  697. if (S == null || L == null) return result;
  698. int n = L.length;
  699. if (n == 0) return result;
  700. int m = L[0].length();
  701. int l = S.length();
  702. Map<String, Integer> countMap = new HashMap<String, Integer>();
  703. for (String w : L) {
  704. Integer count = countMap.get(w);
  705. if (count == null)
  706. countMap.put(w, 1);
  707. else
  708. countMap.put(w, count + 1);
  709. }
  710. for (int i = 0; i <= l - n * m; i++) {
  711. Map<String, Integer> temp = new HashMap<String, Integer>(countMap);
  712. boolean isSubStr = true;
  713. for (int j = 0; j < n; j++) {
  714. String w = S.substring(i + j * m, i + (j + 1) * m);
  715. Integer count = temp.get(w);
  716. if (count == null || count == 0) {
  717. isSubStr = false;
  718. break;
  719. } else {
  720. count--;
  721. temp.put(w, count);
  722. }
  723. }
  724. if (isSubStr)
  725. result.add(i);
  726. }
  727. return result;
  728. }
  729. /**
  730. * https://oj.leetcode.com/problems/next-permutation/
  731. * https://oj.leetcode.com/submissions/detail/9469583/
  732. */
  733. public static void nextPermutation(int[] num) {
  734. if (num == null) return;
  735. int len = num.length;
  736. if (len <= 1) return;
  737. for (int i = len - 2; i >= 0; i--) {
  738. int min = findMin(num, i, len - 1);
  739. if (i < min) {
  740. exch(num, i, min);
  741. sort(num, i + 1, len - 1);
  742. return;
  743. }
  744. }
  745. sort(num, 0, len - 1);
  746. }
  747. private static int findMin(int[] num, int start, int end) {
  748. if (start == end)
  749. return start;
  750. int min = start;
  751. int i = start;
  752. while (i <= end && num[i] <= num[start])
  753. i++;
  754. if (i <= end)
  755. min = i;
  756. for (i = min + 1; i <= end; i++) {
  757. if (num[i] <= num[min] && num[i] > num[start])
  758. min = i;
  759. }
  760. return min;
  761. }
  762. private static void exch(int[] a, int i, int j) {
  763. int swap = a[i];
  764. a[i] = a[j];
  765. a[j] = swap;
  766. }
  767. private static void sort(int[] num, int start, int end) {
  768. if (start == end) return;
  769. for (int i = start + 1; i <= end; i++) {
  770. for (int j = i; j > start && num[j] < num[j - 1]; j--) {
  771. exch(num, j - 1, j);
  772. }
  773. }
  774. }
  775. /**
  776. * https://oj.leetcode.com/problems/longest-valid-parentheses/
  777. * https://oj.leetcode.com/submissions/detail/9511539/
  778. */
  779. public static int longestValidParentheses1(String s) {
  780. int res = 0;
  781. if (s == null || s.length() == 0)
  782. return 0;
  783. int left = 0, right = 0;
  784. for (int i = 0; i <= s.length() - 1; i++) {
  785. if (s.charAt(i) == '(') {
  786. left++;
  787. } else if (s.charAt(i) == ')') {
  788. right++;
  789. if (right == left) {
  790. if (2 * left > res) {
  791. res = 2 * left;
  792. }
  793. } else if (right > left) {
  794. left = 0;
  795. right = 0;
  796. }
  797. }
  798. }
  799. left = 0;
  800. right = 0;
  801. for (int i = s.length() - 1; i >= 0; i--) {
  802. if (s.charAt(i) == ')') {
  803. right++;
  804. } else if (s.charAt(i) == '(') {
  805. left++;
  806. if (left == right) {
  807. if (2 * left > res) {
  808. res = 2 * left;
  809. }
  810. } else if (left > right) {
  811. left = 0;
  812. right = 0;
  813. }
  814. }
  815. }
  816. return res;
  817. }
  818. /**
  819. * http://www.darrensunny.me/leetcode-longest-valid-parentheses/
  820. *
  821. * @param s
  822. * @return
  823. */
  824. public static int longestValidParentheses(String s) {
  825. if (s == null || s.length() == 0)
  826. return 0;
  827. int longestLength = 0; // Length of the longest valid parentheses
  828. int start = 0; // The start index of the possibly longest valid parentheses
  829. Stack<Integer> stack = new Stack<Integer>();
  830. // One-pass scan
  831. for (int i = 0; i < s.length(); i++) {
  832. if (s.charAt(i) == '(') { // Opening parenthesis
  833. stack.push(i); // Push its index
  834. } else { // Closing parenthesis
  835. if (stack.empty()) { // No opening parenthesis to match
  836. start = i + 1; // i+1 is the start of next possibly LVP
  837. } else {
  838. stack.pop(); // The index of the opening parenthesis matched by s[i]
  839. if (stack.empty()) // s[start...i] is matched
  840. longestLength = Math.max(longestLength, i - start + 1);
  841. else // s[stack.peek()] is unmatched; s[stack.peek()+1...i] is matched
  842. longestLength = Math.max(longestLength, i - stack.peek());
  843. }
  844. }
  845. }
  846. return longestLength;
  847. }
  848. /**
  849. * https://oj.leetcode.com/problems/search-in-rotated-sorted-array/
  850. * http://www.darrensunny.me/leetcode-search-in-rotated-sorted-array/
  851. * http://www.darrensunny.me/leetcode-search-in-rotated-sorted-array-ii/
  852. * https://oj.leetcode.com/submissions/detail/9551838/
  853. * https://oj.leetcode.com/submissions/detail/9552605/
  854. */
  855. public int search1(int[] A, int target) {
  856. if (A == null || A.length == 0) return -1;
  857. return searchHelper(A, target, 0, A.length - 1);
  858. }
  859. private int searchHelper(int[] A, int target, int start, int end) {
  860. if (start > end)
  861. return -1;
  862. int mid = start + (end - start) / 2;
  863. if (A[mid] == target)
  864. return mid;
  865. else if (target > A[mid]) {
  866. if (A[end] >= A[mid] && target > A[end])
  867. return searchHelper(A, target, start, mid - 1);
  868. else
  869. return searchHelper(A, target, mid + 1, end);
  870. } else {
  871. if (A[start] <= A[mid] && target < A[start])
  872. return searchHelper(A, target, mid + 1, end);
  873. else
  874. return searchHelper(A, target, start, mid - 1);
  875. }
  876. }
  877. public int search(int[] A, int target) {
  878. if (A == null || A.length == 0) return -1;
  879. int left = 0, right = A.length - 1;
  880. while (left <= right) {
  881. int mid = (left + right) / 2;
  882. if (A[mid] == target)
  883. return mid;
  884. else if (A[mid] > A[left]) {
  885. if (target >= A[left] && target < A[mid])
  886. right = mid - 1;
  887. else
  888. left = mid + 1;
  889. } else if (A[mid] < A[left]) {
  890. if (target > A[mid] && target <= A[right])
  891. left = mid + 1;
  892. else
  893. right = mid - 1;
  894. } else {
  895. left++;
  896. }
  897. }
  898. return -1;
  899. }
  900. /**
  901. * https://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/
  902. * https://oj.leetcode.com/submissions/detail/10902114/
  903. * @param A
  904. * @param target
  905. * @return
  906. */
  907. //Allow duplicated
  908. public boolean search2(int[] A, int target) {
  909. if (A == null || A.length == 0) return false;
  910. int left = 0, right = A.length - 1;
  911. while (left <= right) {
  912. int mid = (left + right) / 2;
  913. if (A[mid] == target)
  914. return true;
  915. else if (A[mid] > A[left]) {
  916. if (target >= A[left] && target < A[mid])
  917. right = mid - 1;
  918. else
  919. left = mid + 1;
  920. } else if (A[mid] < A[left]) {
  921. if (target > A[mid] && target <= A[right])
  922. left = mid + 1;
  923. else
  924. right = mid - 1;
  925. } else {
  926. left++;
  927. }
  928. }
  929. return false;
  930. }
  931. /**
  932. * https://oj.leetcode.com/problems/search-for-a-range/
  933. * http://www.darrensunny.me/leetcode-search-for-a-range/
  934. * https://oj.leetcode.com/submissions/detail/9556992/
  935. */
  936. public static int[] searchRange(int[] A, int target) {
  937. if (A == null || A.length == 0)
  938. return new int[]{-1, -1};
  939. int left = 0, right = A.length - 1;
  940. //Find left matching index
  941. while (left < right) {
  942. if (A[left] > target || A[right] < target)
  943. return new int[]{-1, -1};
  944. int mid = (left + right) / 2;
  945. if (A[mid] < target)
  946. left = mid + 1;
  947. else
  948. right = mid;
  949. }
  950. if (A[left] != target)
  951. return new int[]{-1, -1};
  952. int index1 = left;
  953. right = A.length - 1;
  954. while (left < right) {
  955. int mid = (left + right + 1) / 2;
  956. if (A[mid] > target)
  957. right = mid - 1;
  958. else
  959. left = mid;
  960. }
  961. return new int[]{index1, right};
  962. }
  963. /**
  964. * https://oj.leetcode.com/problems/search-insert-position/
  965. * http://www.programcreek.com/2013/01/leetcode-search-insert-position/
  966. * https://oj.leetcode.com/submissions/detail/9557823/
  967. */
  968. public int searchInsert(int[] A, int target) {
  969. if (A == null || A.length == 0) return 0;
  970. int left = 0, right = A.length - 1;
  971. while (left <= right) {
  972. if (target < A[left]) return left;
  973. if (target > A[right]) return right + 1;
  974. int mid = (left + right) / 2;
  975. if (A[mid] == target) return mid;
  976. else if (A[mid] < target) left = mid + 1;
  977. else right = mid - 1;
  978. }
  979. return left;
  980. }
  981. /**
  982. * https://oj.leetcode.com/problems/valid-sudoku/
  983. * https://oj.leetcode.com/submissions/detail/9559909/
  984. */
  985. public static boolean isValidSudoku(char[][] board) {
  986. for (int i = 0; i < 9; i++) {
  987. char[] row = board[i];
  988. if (!isValidSudoku(row))
  989. return false;
  990. }
  991. char[] column = new char[9];
  992. for (int i = 0; i < 9; i++) {
  993. for (int j = 0; j < 9; j++)
  994. column[j] = board[j][i];
  995. if (!isValidSudoku(column))
  996. return false;
  997. }
  998. for (int i = 0; i < 3; i++) {
  999. for (int j = 0; j < 3; j++) {
  1000. char[] box = new char[9];
  1001. for (int m = 0; m < 3; m++) {
  1002. int ii = i * 3 + m;
  1003. for (int n = 0; n < 3; n++) {
  1004. int jj = j * 3 + n;
  1005. box[m * 3 + n] = board[ii][jj];
  1006. }
  1007. }
  1008. if (!isValidSudoku(box))
  1009. return false;
  1010. }
  1011. }
  1012. return true;
  1013. }
  1014. private static boolean isValidSudoku(char[] c) {
  1015. Map<Character, Integer> map = new HashMap<Character, Integer>();
  1016. for (int i = 0; i < c.length; i++) {
  1017. if (c[i] == '.')
  1018. continue;
  1019. else {
  1020. if (c[i] >= '1' && c[i] <= '9' && map.get(c[i]) == null)
  1021. map.put(c[i], 1);
  1022. else
  1023. return false;
  1024. }
  1025. }
  1026. return true;
  1027. }
  1028. /**
  1029. * https://oj.leetcode.com/problems/sudoku-solver/
  1030. * http://rleetcode.blogspot.com/2014/01/sudoku-solver-java.html
  1031. * https://oj.leetcode.com/submissions/detail/9560489/
  1032. */
  1033. public void solveSudoku(char[][] board) {
  1034. if (board == null || board.length == 0) {
  1035. return;
  1036. }
  1037. solved(board);
  1038. }
  1039. private boolean solved(char[][] board) {
  1040. for (int i = 0; i < board.length; i++) {
  1041. for (int j = 0; j < board[0].length; j++) {
  1042. if (board[i][j] == '.') {
  1043. for (char num = '1'; num <= '9'; num++) {
  1044. if (isValid(board, i, j, num)) {
  1045. // no conflict
  1046. board[i][j] = num;
  1047. if (solved(board)) {
  1048. return true;
  1049. } else {
  1050. board[i][j] = '.';
  1051. }
  1052. }
  1053. }
  1054. // if no proper number found, return false
  1055. return false;
  1056. }
  1057. }
  1058. }
  1059. return true;
  1060. }
  1061. private boolean isValid(char[][] board, int i, int j, char c) {
  1062. // check column
  1063. for (int row = 0; row < 9; row++) {
  1064. if (board[row][j] == c) {
  1065. return false;
  1066. }
  1067. }
  1068. // check row
  1069. for (int col = 0; col < 9; col++) {
  1070. if (board[i][col] == c) {
  1071. return false;
  1072. }
  1073. }
  1074. // check block
  1075. for (int row = i / 3 * 3; row < i / 3 * 3 + 3; row++) {
  1076. for (int col = j / 3 * 3; col < j / 3 * 3 + 3; col++) {
  1077. if (board[row][col] == c) {
  1078. return false;
  1079. }
  1080. }
  1081. }
  1082. return true;
  1083. }
  1084. /**
  1085. * https://oj.leetcode.com/problems/count-and-say/
  1086. * https://oj.leetcode.com/submissions/detail/9651625/
  1087. */
  1088. public String countAndSay(int n) {
  1089. if (n <= 0) return null;
  1090. if (n == 1) return "1";
  1091. StringBuilder sb = new StringBuilder("1");
  1092. for (int i = 2; i <= n; i++) {
  1093. String s = sb.toString();
  1094. sb = new StringBuilder();
  1095. int count = 1, j = 1;
  1096. for (j = 1; j < s.length(); j++) {
  1097. if (s.charAt(j) == s.charAt(j - 1)) {
  1098. count++;
  1099. } else {
  1100. sb.append(count).append(s.charAt(j - 1));
  1101. count = 1;
  1102. }
  1103. }
  1104. sb.append(count).append(s.charAt(j - 1));
  1105. }
  1106. return sb.toString();
  1107. }
  1108. /**
  1109. * https://oj.leetcode.com/problems/combination-sum/
  1110. * http://www.darrensunny.me/leetcode-combination-sum/
  1111. * https://oj.leetcode.com/submissions/detail/9655670/
  1112. */
  1113. public static List<List<Integer>> combinationSum(int[] candidates, int target) {
  1114. List<List<Integer>> r = new ArrayList<List<Integer>>();
  1115. if (candidates == null || candidates.length == 0)
  1116. return r;
  1117. Arrays.sort(candidates);
  1118. int N = 0;
  1119. while (N <= candidates.length - 1 && candidates[N] <= target)
  1120. N++;
  1121. return combinationSum(candidates, N, target);
  1122. }
  1123. private static List<List<Integer>> combinationSum(int[] c, int N, int target) {
  1124. List<List<Integer>> r = new ArrayList<List<Integer>>();
  1125. if (N == 0) {
  1126. } else if (N == 1) {
  1127. if (target % c[0] == 0) {
  1128. List<Integer> l = new ArrayList<Integer>();
  1129. for (int n = 0; n < target / c[0]; n++)
  1130. l.add(c[0]);
  1131. r.add(l);
  1132. }
  1133. } else {
  1134. int d = c[N - 1];
  1135. if (d <= target) {
  1136. for (int n = 0; n <= target / d; n++) {
  1137. int newTarget = target - n * d;
  1138. if (newTarget > 0) {
  1139. List<List<Integer>> l = combinationSum(c, N - 1, newTarget);
  1140. for (List<Integer> b : l) {
  1141. for (int j = 0; j < n; j++)
  1142. b.add(d);
  1143. r.add(b);
  1144. }
  1145. } else {
  1146. List<Integer> l = new ArrayList<Integer>();
  1147. for (int m = 0; m < n; m++) {
  1148. l.add(d);
  1149. }
  1150. r.add(l);
  1151. }
  1152. }
  1153. } else {
  1154. r = combinationSum(c, N - 1, target);
  1155. }
  1156. }
  1157. return r;
  1158. }
  1159. /**
  1160. * https://oj.leetcode.com/problems/combination-sum-ii/
  1161. * https://oj.leetcode.com/submissions/detail/9701592/
  1162. */
  1163. public static List<List<Integer>> combinationSum2(int[] num, int target) {
  1164. List<List<Integer>> result = new ArrayList<List<Integer>>();
  1165. if (num == null || num.length == 0)
  1166. return result;
  1167. Arrays.sort(num); // Sort the candidate in non-descending order
  1168. ArrayList<Integer> current = new ArrayList<Integer>();
  1169. recursiveAppend(num, target, 0, current, result);
  1170. return result;
  1171. }
  1172. private static void recursiveAppend(int[] num, int target, int startIndex,
  1173. List<Integer> current, List<List<Integer>> result) {
  1174. if (target < 0)
  1175. return;
  1176. if (target == 0) { // The current array is an solution
  1177. result.add(new ArrayList<Integer>(current));
  1178. return;
  1179. }
  1180. for (int i = startIndex; i < num.length; i++) {
  1181. if (num[i] > target) // No need to try the remaining candidates
  1182. break;
  1183. // Add candidate[i] to the current array
  1184. ArrayList<Integer> copy = new ArrayList(current);
  1185. copy.add(num[i]);
  1186. while (i <= num.length - 2 && num[i + 1] == num[i])
  1187. i++;
  1188. // Recursively append the current array to compose a solution
  1189. recursiveAppend(num, target - num[i], i + 1, copy, result);
  1190. }
  1191. }
  1192. /**
  1193. * https://oj.leetcode.com/problems/first-missing-positive/
  1194. * https://oj.leetcode.com/submissions/detail/9702757/
  1195. */
  1196. public int firstMissingPositive(int[] A) {
  1197. if (A == null || A.length == 0) return 1;
  1198. HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
  1199. for (int i = 0; i < A.length; i++)
  1200. map.put(A[i], 1);
  1201. int missing = 1;
  1202. while (map.get(missing) != null) missing++;
  1203. return missing;
  1204. }
  1205. /**
  1206. * https://oj.leetcode.com/problems/trapping-rain-water/
  1207. * https://oj.leetcode.com/submissions/detail/9704165/
  1208. */
  1209. public int trap(int[] A) {
  1210. if (A == null || A.length <= 2)
  1211. return 0;
  1212. int result = 0;
  1213. int N = A.length;
  1214. HashMap<Integer, LeftAndRight> map = new HashMap<Integer, LeftAndRight>();
  1215. map.put(1, new LeftAndRight(A[0], 0));
  1216. for (int i = 2; i <= N - 2; i++) {
  1217. int left = map.get(i - 1).left;
  1218. int a = Math.max(left, A[i - 1]);
  1219. map.put(i, new LeftAndRight(a, 0));
  1220. }
  1221. LeftAndRight l = map.get(N - 2);
  1222. l.right = A[N - 1];
  1223. map.put(N - 2, l);
  1224. for (int i = A.length - 3; i >= 1; i--) {
  1225. int right = map.get(i + 1).right;
  1226. int b = Math.max(A[i + 1], right);
  1227. LeftAndRight r = map.get(i);
  1228. r.right = b;
  1229. map.put(i, r);
  1230. }
  1231. for (int i = 1; i <= N - 2; i++) {
  1232. LeftAndRight m = map.get(i);
  1233. int k = Math.min(m.left, m.right);
  1234. if (k > A[i]) result += (k - A[i]);
  1235. }
  1236. return result;
  1237. }
  1238. private class LeftAndRight {
  1239. int left;
  1240. int right;
  1241. LeftAndRight(int left, int right) {
  1242. this.left = left;
  1243. this.right = right;
  1244. }
  1245. }
  1246. /**
  1247. * https://oj.leetcode.com/problems/multiply-strings/
  1248. * http://www.darrensunny.me/leetcode-multiply-strings/
  1249. * https://oj.leetcode.com/submissions/detail/9825634/
  1250. */
  1251. public String multiply1(String num1, String num2) {
  1252. if (num1 == null || num1.length() == 0 ||
  1253. num2 == null || num2.length() == 0)
  1254. return "";
  1255. if (num1.equals("0") || num2.equals("0")) // Either one is 0
  1256. return "0";
  1257. int m = num1.length(), n = num2.length();
  1258. // Multiply single digit of each number and add up products at each position
  1259. int[] prods = new int[m + n];
  1260. for (int i = n - 1; i >= 0; i--)
  1261. for (int j = m - 1; j >= 0; j--)
  1262. prods[i + j + 1] += (num2.charAt(i) - '0') * (num1.charAt(j) - '0');
  1263. // Keep a single digit at each position and add carry to a higher position
  1264. StringBuilder result = new StringBuilder();
  1265. for (int i = n + m - 1; i >= 0; i--) {
  1266. result.insert(0, prods[i] % 10);
  1267. if (i > 0)
  1268. prods[i - 1] += prods[i] / 10; // Carry
  1269. }
  1270. // Get rid of one leaing "0" (if any)
  1271. if (result.charAt(0) == '0')
  1272. result.deleteCharAt(0);
  1273. return result.toString();
  1274. }
  1275. public static String multiply(String num1, String num2) {
  1276. if (num1 == null && num2 == null) return null;
  1277. if (num1 != null && num2 == null) return num1;
  1278. if (num1 == null && num2 != null) return num2;
  1279. if (num1.equals("0") || num2.equals("0")) return "0";
  1280. int N1 = num1.length();
  1281. int N2 = num2.length();
  1282. String result = "";
  1283. if (N1 > N2) {
  1284. for (int i = 0; i < N2; i++) {
  1285. String s = "";
  1286. int c = num2.charAt(i) - '0';
  1287. for (int j = 0; j < c; j++) {
  1288. s = add(s, num1);
  1289. }
  1290. for (int j = 0; j < (N2 - 1 - i); j++)
  1291. s += "0";
  1292. result = add(result, s);
  1293. }
  1294. } else {
  1295. for (int i = 0; i < N1; i++) {
  1296. String s = "";
  1297. int c = num1.charAt(i) - '0';
  1298. for (int j = 0; j < c; j++) {
  1299. s = add(s, num2);
  1300. }
  1301. for (int j = 0; j < (N1 - 1 - i); j++)
  1302. s += "0";
  1303. result = add(result, s);
  1304. }
  1305. }
  1306. return result;
  1307. }
  1308. private static String add(String num1, String num2) {
  1309. if (num1 == null && num2 == null) return null;
  1310. if (num1 != null && (num2 == null || num2.length() == 0 || num2.equals("0"))) return num1;
  1311. if ((num1 == null || num1.length() == 0 || num1.equals("0")) && num2 != null) return num2;
  1312. Stack<Character> s1 = new Stack<Character>();
  1313. Stack<Character> s2 = new Stack<Character>();
  1314. Stack<Character> s3 = new Stack<Character>();
  1315. for (int i = 0; i < num1.length(); i++)
  1316. s1.push(num1.charAt(i));
  1317. for (int i = 0; i < num2.length(); i++)
  1318. s2.push(num2.charAt(i));
  1319. int carryOver = 0;
  1320. while (!s1.isEmpty() || !s2.isEmpty()) {
  1321. Character c1 = null;
  1322. Character c2 = null;
  1323. if (!s1.isEmpty())
  1324. c1 = s1.pop();
  1325. if (!s2.isEmpty())
  1326. c2 = s2.pop();
  1327. if (c1 != null)
  1328. carryOver += c1 - '0';
  1329. if (c2 != null)
  1330. carryOver += c2 - '0';
  1331. s3.push(toCharacter(carryOver % 10));
  1332. carryOver /= 10;
  1333. }
  1334. if (carryOver == 1)
  1335. s3.push(toCharacter(carryOver));
  1336. StringBuilder sb = new StringBuilder();
  1337. while (!s3.isEmpty())
  1338. sb.append(s3.pop());
  1339. return sb.toString();
  1340. }
  1341. private static Character toCharacter(int c) {
  1342. if (c == 0) return '0';
  1343. else if (c == 1) return '1';
  1344. else if (c == 2) return '2';
  1345. else if (c == 3) return '3';
  1346. else if (c == 4) return '4';
  1347. else if (c == 5) return '5';
  1348. else if (c == 6) return '6';
  1349. else if (c == 7) return '7';
  1350. else if (c == 8) return '8';
  1351. else if (c == 9) return '9';
  1352. else return null;
  1353. }
  1354. /**
  1355. * https://oj.leetcode.com/problems/wildcard-matching/
  1356. * http://www.darrensunny.me/leetcode-wildcard-matching-2/
  1357. * http://www.programering.com/a/MTN0kzMwATU.html isMatch4 (working one)
  1358. * https://oj.leetcode.com/submissions/detail/9830224/
  1359. */
  1360. public static boolean isMatch2(String s, String p) {
  1361. if (s == null) return p == null;
  1362. if (p == null) return s == null;
  1363. if (p.length() == 0) return s.length() == 0;
  1364. if (p.equals("*")) return true;
  1365. if (s.length() == 0) return p.length() == 0;
  1366. char c = p.charAt(p.length() - 1);
  1367. if (c != '?' && c != '*' && c != s.charAt(s.length() - 1)) return false;
  1368. if (p.charAt(0) == '?') return isMatch2(s.substring(1), p.substring(1));
  1369. if (p.charAt(0) == '*') {
  1370. int j = 0;
  1371. while (j < p.length() && p.charAt(j) == '*')
  1372. j++;
  1373. if (j >= p.length())
  1374. return true;
  1375. int i = 0;
  1376. while (i < s.length()) {
  1377. if (isMatch2(s.substring(i), p.substring(j)))
  1378. return true;
  1379. i++;
  1380. }
  1381. return false;
  1382. }
  1383. return s.charAt(0) == p.charAt(0) && isMatch2(s.substring(1), p.substring(1));
  1384. }
  1385. public static boolean isMatch3(String s, String p) {
  1386. if (s == null || p == null)
  1387. return false;
  1388. int m = s.length(), n = p.length();
  1389. boolean[] match = new boolean[m + 1]; // Used for dynamic programming
  1390. match[0] = true;
  1391. // After each round, the information whether p[0...i] matches s[0...m-1]
  1392. // is updated in match[1...m]
  1393. for (int i = 0; i < n; i++) {
  1394. if (p.charAt(i) != '*') { // Not wildcard
  1395. for (int j = m; j > 0; j--) // Update match backwards
  1396. match[j] = match[j - 1] &&
  1397. (p.charAt(i) == '?' || s.charAt(j - 1) == p.charAt(i));
  1398. } else { // Wildcard
  1399. int j = 0;
  1400. // Find the minimum j with p[0...i-1] matching s[0...j]
  1401. while (j <= m && !match[j])
  1402. j++;
  1403. // Since p[i] is '*' that matches any sequence, p[0...i] matches with
  1404. // s[0...j+1], s[0...j+2] ...
  1405. for (; j <= m; j++)
  1406. match[j] = true;
  1407. }
  1408. match[0] = match[0] && p.charAt(i) == '*';
  1409. }
  1410. return match[m];
  1411. }
  1412. public static boolean isMatch4(String s, String p) {
  1413. if (s == null || p == null) return false;
  1414. if (s.equals(p)) return true;
  1415. int m = s.length();
  1416. int n = p.length();
  1417. int posS = 0;
  1418. int posP = 0;
  1419. int posStar = -1;
  1420. int posOfS = -1;
  1421. //if posS == posP || posP == '?', ++posS and ++posP.
  1422. //posOfS, posStar, record the positon of '*' in s and p, ++posP and go on.
  1423. //if not match, go back to star, ++posOfS
  1424. while (posS < m) {
  1425. if (posP < n && (s.charAt(posS) == p.charAt(posP) || p.charAt(posP) == '?')) {
  1426. ++posS;
  1427. ++posP;
  1428. } else if (posP < n && p.charAt(posP) == '*') {
  1429. posStar = posP;
  1430. posOfS = posS;
  1431. ++posP;
  1432. continue;
  1433. } else if (posStar != -1) {
  1434. posS = posOfS;
  1435. posP = posStar + 1;
  1436. ++posOfS;
  1437. } else {
  1438. return false;
  1439. }
  1440. }
  1441. while (posP < n && p.charAt(posP) == '*') {
  1442. ++posP;
  1443. }
  1444. return posS == m && posP == n;
  1445. }
  1446. /**
  1447. * https://oj.leetcode.com/problems/jump-game-ii/
  1448. * http://www.darrensunny.me/leetcode-jump-game-ii/
  1449. * https://oj.leetcode.com/submissions/detail/9860022/
  1450. */
  1451. public int jump(int[] A) {
  1452. if (A == null || A.length == 1) return 0;
  1453. int N = A.length;
  1454. if (N == 2 || A[0] >= N - 1) return 1;
  1455. int[] B = new int[N];
  1456. B[N - 1] = 0;
  1457. B[N - 2] = 1;
  1458. for (int i = N - 3; i >= 0; i--) {
  1459. if (A[i] >= N - 1 - i)
  1460. B[i] = 1;
  1461. else {
  1462. int min = N;
  1463. for (int j = i + 1; j <= i + A[i]; j++) {
  1464. if (B[j] < min)
  1465. min = B[j];
  1466. }
  1467. B[i] = min + 1;
  1468. }
  1469. }
  1470. return B[0];
  1471. }
  1472. public int jump2(int[] A) {
  1473. if (A == null) return -1;
  1474. int n = A.length;
  1475. if (n == 1) return 0;
  1476. int jump = 0; // The number of jumps
  1477. // The beginning and ending indices of elements that are "jump" jumps
  1478. // away from the first element
  1479. int begin = 0, end = 0;
  1480. // For each outer loop, find the largest index of the element that are
  1481. // "jump+1" jumps from the first
  1482. while (true) {
  1483. jump++;
  1484. int temp = 0; // Used to keep track of the largest index
  1485. // The elements "jump+1" jumps away are approachable by the elements
  1486. // that are "jump" jumps away
  1487. for (int i = begin; i <= end; i++) {
  1488. temp = Math.max(temp, A[i] + i);
  1489. if (temp >= n - 1) // Once the largest index exceeds the array, we are done
  1490. return jump;
  1491. }
  1492. // Update "begin" and "end" as the indices of the elements "jump" jumps away
  1493. begin = end + 1;
  1494. end = temp;
  1495. }
  1496. }
  1497. /**
  1498. * https://oj.leetcode.com/problems/permutations/
  1499. * http://www.programcreek.com/2013/02/leetcode-permutations-java/
  1500. * http://www.darrensunny.me/leetcode-permutations/
  1501. * https://oj.leetcode.com/submissions/detail/9861658/
  1502. */
  1503. public static List<List<Integer>> permute(int[] num) {
  1504. List<List<Integer>> r = new ArrayList<List<Integer>>();
  1505. Set<List<Integer>> set = new HashSet<List<Integer>>();
  1506. List<Integer> list = new ArrayList<Integer>();
  1507. permuteHelper(set, num, list, num.length);
  1508. for (List<Integer> l : set)
  1509. r.add(l);
  1510. return r;
  1511. }
  1512. private static void permuteHelper(Set<List<Integer>> set, int[] num, List<Integer> list, int total) {
  1513. if (list.size() == total)
  1514. set.add(list);
  1515. if (num == null || num.length == 0) return;
  1516. int N = num.length;
  1517. for (int i = 0; i < N; i++) {
  1518. int n = num[i];
  1519. List<Integer> copyList = new ArrayList<Integer>(list);
  1520. copyList.add(n);
  1521. int[] copyNum = new int[N - 1];
  1522. for (int j = 0; j < i; j++) copyNum[j] = num[j];
  1523. for (int j = i; j < N - 1; j++) copyNum[j] = num[j + 1];
  1524. permuteHelper(set, copyNum, copyList, total);
  1525. }
  1526. }
  1527. /**
  1528. * http://www.programcreek.com/2013/02/leetcode-permutations-java
  1529. */
  1530. public static List<List<Integer>> permute1(int[] num) {
  1531. List<List<Integer>> result = new ArrayList<List<Integer>>();
  1532. result.add(new ArrayList<Integer>());
  1533. for (int i = 0; i < num.length; i++) {
  1534. List<List<Integer>> current = new ArrayList<List<Integer>>();
  1535. for (List<Integer> l : result) {
  1536. for (int j = 0; j <= l.size(); j++) {
  1537. l.add(j, num[i]);
  1538. List<Integer> temp = new ArrayList<Integer>(l);
  1539. current.add(temp);
  1540. l.remove(j);
  1541. }
  1542. }
  1543. result = new ArrayList<List<Integer>>(current);
  1544. }
  1545. return result;
  1546. }
  1547. /**
  1548. * http://www.programcreek.com/2013/02/leetcode-permutations-java/
  1549. */
  1550. public List<List<Integer>> permute2(int[] num) {
  1551. List<List<Integer>> result = new ArrayList<List<Integer>>();
  1552. permute(num, 0, result);
  1553. return result;
  1554. }
  1555. void permute(int[] num, int start, List<List<Integer>> result) {
  1556. if (start >= num.length) {
  1557. ArrayList<Integer> item = convertArrayToList(num);
  1558. result.add(item);
  1559. }
  1560. for (int j = start; j <= num.length - 1; j++) {
  1561. swap(num, start, j);
  1562. permute(num, start + 1, result);
  1563. swap(num, start, j);
  1564. }
  1565. }
  1566. /**
  1567. * http://www.darrensunny.me/leetcode-permutations/
  1568. */
  1569. public List<List<Integer>> permute3(int[] num) {
  1570. if (num == null)
  1571. return null;
  1572. List<List<Integer>> result = new ArrayList<List<Integer>>();
  1573. if (num.length == 0)
  1574. return result;
  1575. recursivePermute(num, new boolean[num.length], new ArrayList<Integer>(), result);
  1576. return result;
  1577. }
  1578. // If "current" is already a permutation of "num", add it to "result";
  1579. // otherwise, append each unused number to "current", and recursively try next unused number
  1580. private void recursivePermute(int[] num, boolean[] used, ArrayList<Integer> current,
  1581. ArrayList<ArrayList<Integer>> result) {
  1582. if (current.size() == num.length) { // "current" is already a permutation of "num"
  1583. result.add(new ArrayList<Integer>(current));
  1584. return;
  1585. }
  1586. // Append each unused number to "current", and recursively try next unused number
  1587. for (int i = 0; i < num.length; i++) {
  1588. if (!used[i]) {
  1589. // Append an unused number
  1590. used[i] = true;
  1591. current.add(num[i]);
  1592. // Recursively append next unused number
  1593. recursivePermute(num, used, current, result);
  1594. // Get back to original state, get ready for appending another unused number
  1595. current.remove(current.size() - 1);
  1596. used[i] = false;
  1597. }
  1598. }
  1599. }
  1600. /**
  1601. * https://oj.leetcode.com/problems/permutations-ii/
  1602. * https://oj.leetcode.com/submissions/detail/9863455/
  1603. */
  1604. public static List<List<Integer>> permuteUnique(int[] num) {
  1605. List<List<Integer>> result = new ArrayList<List<Integer>>();
  1606. permuteUnique(num, 0, result);
  1607. return result;
  1608. }
  1609. private static void permuteUnique(int[] num, int start, List<List<Integer>> result) {
  1610. if (start >= num.length) {
  1611. ArrayList<Integer> item = convertArrayToList(num);
  1612. result.add(item);
  1613. return;
  1614. }
  1615. permuteUnique(num, start + 1, result);
  1616. Set<Integer> set = new HashSet<Integer>();
  1617. for (int j = start + 1; j <= num.length - 1; j++) {
  1618. if (num[start] != num[j] && !set.contains(num[j])) {
  1619. set.add(num[j]);
  1620. swap(num, start, j);
  1621. permuteUnique(num, start + 1, result);
  1622. swap(num, start, j);
  1623. }
  1624. }
  1625. }
  1626. private static ArrayList<Integer> convertArrayToList(int[] num) {
  1627. ArrayList<Integer> item = new ArrayList<Integer>();
  1628. for (int h = 0; h < num.length; h++) {
  1629. item.add(num[h]);
  1630. }
  1631. return item;
  1632. }
  1633. private static void swap(int[] a, int i, int j) {
  1634. int temp = a[i];
  1635. a[i] = a[j];
  1636. a[j] = temp;
  1637. }
  1638. public static List<List<Integer>> permuteUnique2(int[] num) {
  1639. if (num == null)
  1640. return null;
  1641. List<List<Integer>> result = new ArrayList<List<Integer>>();
  1642. if (num.length == 0)
  1643. return result;
  1644. Arrays.sort(num); // Sort the array in non-descending order
  1645. recursivePermute(num, new boolean[num.length], new ArrayList<Integer>(), result);
  1646. return result;
  1647. }
  1648. // If "current" is already a permutation of "num", add it to "result";
  1649. // otherwise, append each unused number to "current", and recursively try next unused number
  1650. private static void recursivePermute(int[] num, boolean[] used, List<Integer> current,
  1651. List<List<Integer>> result) {
  1652. if (current.size() == num.length) { // "current" is already a permutation of "num"
  1653. result.add(new ArrayList<Integer>(current));
  1654. return;
  1655. }
  1656. // Append each unused number to "current", and recursively try next unused number
  1657. for (int i = 0; i < num.length; i++) {
  1658. if (i > 0 && !used[i - 1] && num[i] == num[i - 1])
  1659. // Do not consider a duplicate number if its earlier appearance has
  1660. // not been considered yet
  1661. continue;
  1662. if (!used[i]) {
  1663. // Append an unused number
  1664. used[i] = true;
  1665. current.add(num[i]);
  1666. // Recursively append next unused number
  1667. recursivePermute(num, used, current, result);
  1668. // Get back to original state, get ready for appending another unused number
  1669. current.remove(current.size() - 1);
  1670. used[i] = false;
  1671. }
  1672. }
  1673. }
  1674. /**
  1675. * https://oj.leetcode.com/problems/permutation-sequence/
  1676. * https://oj.leetcode.com/submissions/detail/10252180/
  1677. *
  1678. */
  1679. public static String getPermutation(int n, int k) {
  1680. int[] N = new int[n];
  1681. for(int i = 0; i < n; i++) {
  1682. N[i] = i + 1;
  1683. }
  1684. return getPermutation(N, k);
  1685. }
  1686. private static String getPermutation(int[] N, int k){
  1687. if(k == 1) {
  1688. StringBuilder sb = new StringBuilder();
  1689. for(int i = 0; i < N.length; i++){
  1690. sb.append(N[i]);
  1691. }
  1692. return sb.toString();
  1693. }
  1694. int startIndex = (k - 1) / factorial(N.length -1);
  1695. String start = "" + N[startIndex];
  1696. k = k - startIndex * factorial(N.length - 1);
  1697. int[] M = new int[N.length - 1];
  1698. for(int i = 0; i < startIndex; i++){
  1699. M[i] = N[i];
  1700. }
  1701. for(int i = startIndex; i <= N.length - 2; i++){
  1702. M[i] = N[i+1];
  1703. }
  1704. return start + getPermutation(M, k);
  1705. }
  1706. private static int factorial(int n){
  1707. int result = 1;
  1708. for(int i = 1; i <= n; i++){
  1709. result *= i;
  1710. }
  1711. return result;
  1712. }
  1713. /**
  1714. * https://oj.leetcode.com/problems/rotate-list/
  1715. * https://oj.leetcode.com/submissions/detail/10253951/
  1716. */
  1717. public ListNode rotateRight(ListNode head, int n) {
  1718. if(n == 0 || head == null) return head;
  1719. //Get the length of the list
  1720. int len = 1;
  1721. ListNode node = head;
  1722. while(node.next != null){
  1723. node = node.next;
  1724. len++;
  1725. }
  1726. if(len == 1 || n % len == 0) return head;
  1727. int offset = len - n % len;
  1728. ListNode prev = head;
  1729. while(offset > 1){
  1730. prev = prev.next;
  1731. offset--;
  1732. }
  1733. ListNode newHead = prev.next;
  1734. prev.next = null;
  1735. node.next = head;
  1736. return newHead;
  1737. }
  1738. /**
  1739. * https://oj.leetcode.com/problems/rotate-image/
  1740. * https://oj.leetcode.com/submissions/detail/9903296/
  1741. */
  1742. public void rotate(int[][] matrix) {
  1743. if (matrix == null || matrix[0].length <= 1) return;
  1744. int N = matrix[0].length;
  1745. for (int layer = 0; layer < N / 2; layer++) {
  1746. int rowStart = layer;
  1747. int rowEnd = N - 1 - layer;
  1748. int colStart = layer;
  1749. int colEnd = N - 1 - layer;
  1750. rotate(matrix, rowStart, rowEnd, colStart, colEnd);
  1751. }
  1752. }
  1753. private static void rotate(int[][] matrix, int rowStart, int rowEnd, int colStart, int colEnd) {
  1754. for (int i = 0; i <= colEnd - colStart - 1; i++) {
  1755. int temp = matrix[rowStart][colStart + i];
  1756. matrix[rowStart][colStart + i] = matrix[rowEnd - i][colStart];
  1757. matrix[rowEnd - i][colStart] = matrix[rowEnd][colEnd - i];
  1758. matrix[rowEnd][colEnd - i] = matrix[rowStart + i][colEnd];
  1759. matrix[rowStart + i][colEnd] = temp;
  1760. }
  1761. }
  1762. /**
  1763. * https://oj.leetcode.com/problems/anagrams/
  1764. * https://oj.leetcode.com/submissions/detail/9905057/
  1765. */
  1766. public static List<String> anagrams(String[] strs) {
  1767. List<String> result = new ArrayList<String>();
  1768. if (strs == null || strs.length <= 1) return result;
  1769. Map<String, List<String>> map = new HashMap<String, List<String>>();
  1770. for (int i = 0; i < strs.length; i++) {
  1771. String s = strs[i];
  1772. if (s != null) {
  1773. String key = s;
  1774. if (s.trim().length() > 0) {
  1775. char[] cArray = s.toCharArray();
  1776. Arrays.sort(cArray);
  1777. key = arrayToString(cArray);
  1778. }
  1779. if (!map.containsKey(key)) {
  1780. List<String> list = new ArrayList<String>();
  1781. list.add(s);
  1782. map.put(key, list);
  1783. } else {
  1784. List<String> list = map.get(key);
  1785. list.add(s);
  1786. }
  1787. }
  1788. }
  1789. for (String key : map.keySet()) {
  1790. List<String> list = map.get(key);
  1791. if (list != null && list.size() >= 2) {
  1792. result.addAll(list);
  1793. }
  1794. }
  1795. return result;
  1796. }
  1797. private static String arrayToString(char[] cArray) {
  1798. StringBuilder sb = new StringBuilder();
  1799. for (char c : cArray)
  1800. sb.append(c);
  1801. return sb.toString();
  1802. }
  1803. public static List<String> anagrams2(String[] strs) {
  1804. List<String> result = new ArrayList<String>();
  1805. if (strs == null || strs.length <= 1) return result;
  1806. boolean[] isAnagram = new boolean[strs.length];
  1807. for (int i = 0; i <= strs.length - 2; i++) {
  1808. if (isAnagram[i]) continue;
  1809. String s = strs[i];
  1810. for (int j = i + 1; j < strs.length; j++) {
  1811. if (isAnagram[j]) continue;
  1812. if (isAnagram(s, strs[j])) {
  1813. isAnagram[i] = true;
  1814. isAnagram[j] = true;
  1815. }
  1816. }
  1817. }
  1818. for (int i = 0; i < strs.length; i++) {
  1819. if (isAnagram[i]) result.add(strs[i]);
  1820. }
  1821. return result;
  1822. }
  1823. private static boolean isAnagram(String s1, String s2) {
  1824. if (s1 == null || s2 == null) return false;
  1825. if (s1.length() != s2.length()) return false;
  1826. if (s1.equals(s2)) return true;
  1827. Map<Character, Integer> countMap = new HashMap<Character, Integer>();
  1828. for (int i = 0; i < s1.length(); i++) {
  1829. char c = s1.charAt(i);
  1830. if (countMap.get(c) == null) countMap.put(c, 1);
  1831. else countMap.put(c, countMap.get(c) + 1);
  1832. }
  1833. for (int i = 0; i < s2.length(); i++) {
  1834. char c = s2.charAt(i);
  1835. if (countMap.get(c) == null || countMap.get(c) == 0) return false;
  1836. else countMap.put(c, countMap.get(c) - 1);
  1837. }
  1838. return true;
  1839. }
  1840. /**
  1841. * https://oj.leetcode.com/problems/powx-n/
  1842. * https://oj.leetcode.com/submissions/detail/9905406/
  1843. */
  1844. public double pow(double x, int n) {
  1845. if (n == 0) return 1;
  1846. if (n == 1) return x;
  1847. if (n == 2) return x * x;
  1848. int m = Math.abs(n);
  1849. double y = pow(x, m / 2);
  1850. if (m % 2 == 0) y = y * y;
  1851. else y = y * y * x;
  1852. if (n < 0)
  1853. return 1.0 / y;
  1854. else
  1855. return y;
  1856. }
  1857. /**
  1858. * https://oj.leetcode.com/problems/n-queens/
  1859. * http://www.darrensunny.me/leetcode-n-queens/
  1860. * https://oj.leetcode.com/problems/n-queens-ii/
  1861. * https://oj.leetcode.com/submissions/detail/9980530/
  1862. * https://oj.leetcode.com/submissions/detail/10196846/
  1863. * https://oj.leetcode.com/submissions/detail/10197004/
  1864. */
  1865. public static int totalNQueens(int n) {
  1866. int[] solutions = new int[1];
  1867. if (n <= 0) return solutions[0];
  1868. solved2(solutions, newBoard(n), 0);
  1869. return solutions[0];
  1870. }
  1871. private static void solved2(int[] solutions, char[][] board, int row) {
  1872. int N = board.length;
  1873. if (row == N)
  1874. solutions[0]++;
  1875. else {
  1876. for (int j = 0; j < N; j++) {
  1877. if (isValid(board, row, j)) {
  1878. board[row][j] = 'Q';
  1879. solved2(solutions, board, row + 1);
  1880. }
  1881. board[row][j] = '.';
  1882. }
  1883. }
  1884. }
  1885. public static List<String[]> solveNQueens(int n) {
  1886. List<String[]> result = new ArrayList<String[]>();
  1887. if (n <= 0) return result;
  1888. solved(result, newBoard(n), 0);
  1889. return result;
  1890. }
  1891. private static char[][] newBoard(int n) {
  1892. char[][] board = new char[n][n];
  1893. for (int i = 0; i < n; i++)
  1894. for (int j = 0; j < n; j++)
  1895. board[i][j] = '.';
  1896. return board;
  1897. }
  1898. private static String[] toStringArray(char[][] board) {
  1899. int N = board.length;
  1900. String[] strs = new String[N];
  1901. for (int i = 0; i < N; i++) {
  1902. StringBuilder sb = new StringBuilder();
  1903. for (int j = 0; j < N; j++) {
  1904. sb.append(board[i][j]);
  1905. }
  1906. strs[i] = sb.toString();
  1907. }
  1908. return strs;
  1909. }
  1910. private static void solved(List<String[]> result, char[][] board, int row) {
  1911. int N = board.length;
  1912. if (row == N)
  1913. result.add(toStringArray(board));
  1914. else {
  1915. for (int j = 0; j < N; j++) {
  1916. if (isValid(board, row, j)) {
  1917. board[row][j] = 'Q';
  1918. solved(result, board, row + 1);
  1919. }
  1920. board[row][j] = '.';
  1921. }
  1922. }
  1923. }
  1924. private static boolean isValid(char[][] board, int i, int j) {
  1925. int N = board.length;
  1926. //check column
  1927. for (int row = 0; row < N; row++) {
  1928. if (board[row][j] == 'Q')
  1929. return false;
  1930. }
  1931. //check row
  1932. for (int col = 0; col < N; col++) {
  1933. if (board[i][col] == 'Q')
  1934. return false;
  1935. }
  1936. //check diagnal
  1937. int row = i - 1;
  1938. int col = j - 1;
  1939. while (row >= 0 && col >= 0) {
  1940. if (board[row][col] == 'Q')
  1941. return false;
  1942. row--;
  1943. col--;
  1944. }
  1945. row = i + 1;
  1946. col = j + 1;
  1947. while (row < N && col < N) {
  1948. if (board[row][col] == 'Q')
  1949. return false;
  1950. row++;
  1951. col++;
  1952. }
  1953. row = i - 1;
  1954. col = j + 1;
  1955. while (row >= 0 && col < N) {
  1956. if (board[row][col] == 'Q')
  1957. return false;
  1958. row--;
  1959. col++;
  1960. }
  1961. row = i + 1;
  1962. col = j - 1;
  1963. while (row < N && col >= 0) {
  1964. if (board[row][col] == 'Q')
  1965. return false;
  1966. row++;
  1967. col--;
  1968. }
  1969. return true;
  1970. }
  1971. /**
  1972. * https://oj.leetcode.com/problems/maximum-subarray/
  1973. * http://www.darrensunny.me/leetcode-maximum-subarray/
  1974. * https://oj.leetcode.com/submissions/detail/10198030/
  1975. */
  1976. public static int maxSubArray(int[] A) {
  1977. return maxSubArray(A, 0, A.length - 1);
  1978. }
  1979. public static int maxSubArray(int[] A, int lo, int hi) {
  1980. if (A == null || A.length == 0 || lo > hi) return Integer.MIN_VALUE;
  1981. if (A.length == 1 || lo == hi) return A[lo];
  1982. int mid = (lo + hi) / 2;
  1983. int max1 = maxSubArray(A, lo, mid - 1);
  1984. int max2 = maxSubArray(A, mid + 1, hi);
  1985. int max3 = A[mid];
  1986. int max = max3;
  1987. for (int i = mid - 1; i >= lo; i--) {
  1988. max3 += A[i];
  1989. max = Math.max(max, max3);
  1990. }
  1991. max3 = max;
  1992. for (int i = mid + 1; i <= hi; i++) {
  1993. max3 += A[i];
  1994. max = Math.max(max, max3);
  1995. }
  1996. max = Math.max(max, max1);
  1997. max = Math.max(max, max2);
  1998. return max;
  1999. }
  2000. public static int maxSubArray2(int[] A) {
  2001. if (A == null || A.length == 0)
  2002. return 0;
  2003. int sum = 0, maxSum = Integer.MIN_VALUE;
  2004. // Find maximum sum of all subarrays with the properties:
  2005. // 1. Any prefix of it is non-negative;
  2006. // 2. Any suffix of its preceding numbers are non-positive
  2007. // 3. Any prefix of its following numbers are non-positive
  2008. for (int i = 0; i < A.length; i++) {
  2009. sum += A[i];
  2010. maxSum = Math.max(sum, maxSum);
  2011. if (sum < 0)
  2012. // Preceding numbers make negative contribution;
  2013. // no need to take them into consideration
  2014. sum = 0;
  2015. }
  2016. return maxSum;
  2017. }
  2018. /**
  2019. * https://oj.leetcode.com/problems/spiral-matrix/
  2020. * https://oj.leetcode.com/submissions/detail/10200955/
  2021. */
  2022. public static List<Integer> spiralOrder(int[][] matrix) {
  2023. if (matrix == null) return null;
  2024. List<Integer> result = new ArrayList<Integer>();
  2025. int m = matrix.length;
  2026. if (m == 0)
  2027. return result;
  2028. int n = matrix[0].length;
  2029. if (n == 0)
  2030. return result;
  2031. int N = Math.min(m, n);
  2032. for (int offset = 0; offset <= (N + 1) / 2 - 1; offset++) {
  2033. int rowStart = offset, rowEnd = m - 1 - offset, colStart = offset, colEnd = n - 1 - offset;
  2034. spiral(result, matrix, rowStart, rowEnd, colStart, colEnd);
  2035. }
  2036. return result;
  2037. }
  2038. private static void spiral(List<Integer> result, int[][] matrix, int rowStart, int rowEnd, int colStart, int colEnd) {
  2039. if (rowStart == rowEnd)
  2040. for (int i = colStart; i <= colEnd; i++)
  2041. result.add(matrix[rowStart][i]);
  2042. else if (colStart == colEnd)
  2043. for (int i = rowStart; i <= rowEnd; i++)
  2044. result.add(matrix[i][colStart]);
  2045. else if (rowStart < rowEnd && colStart < colEnd) {
  2046. for (int i = colStart; i <= colEnd; i++)
  2047. result.add(matrix[rowStart][i]);
  2048. for (int i = rowStart + 1; i <= rowEnd; i++)
  2049. result.add(matrix[i][colEnd]);
  2050. for (int i = colEnd - 1; i >= colStart; i--)
  2051. result.add(matrix[rowEnd][i]);
  2052. for (int i = rowEnd - 1; i >= rowStart + 1; i--)
  2053. result.add(matrix[i][colStart]);
  2054. }
  2055. }
  2056. /**
  2057. * https://oj.leetcode.com/problems/spiral-matrix-ii/
  2058. * https://oj.leetcode.com/submissions/detail/10248635/
  2059. *
  2060. */
  2061. public int[][] generateMatrix(int n) {
  2062. if(n < 0) return null;
  2063. int[][] matrix = new int[n][n];
  2064. if(n == 0) return matrix;
  2065. int[] count = new int[1];
  2066. count[0] = 1;
  2067. for (int offset = 0; offset <= (n + 1) / 2 - 1; offset++) {
  2068. int rowStart = offset, rowEnd = n - 1 - offset, colStart = offset, colEnd = n - 1 - offset;
  2069. spiralMatrix(matrix, rowStart, rowEnd, colStart, colEnd, count);
  2070. }
  2071. return matrix;
  2072. }
  2073. private static void spiralMatrix(int[][] matrix, int rowStart, int rowEnd, int colStart, int colEnd, int[] count) {
  2074. if (rowStart == rowEnd)
  2075. for (int i = colStart; i <= colEnd; i++) {
  2076. matrix[rowStart][i] = count[0];
  2077. count[0]++;
  2078. }
  2079. else if (colStart == colEnd)
  2080. for (int i = rowStart; i <= rowEnd; i++) {
  2081. matrix[i][colStart] = count[0];
  2082. count[0]++;
  2083. }
  2084. else if (rowStart < rowEnd && colStart < colEnd) {
  2085. for (int i = colStart; i <= colEnd; i++) {
  2086. matrix[rowStart][i] = count[0];
  2087. count[0]++;
  2088. }
  2089. for (int i = rowStart + 1; i <= rowEnd; i++) {
  2090. matrix[i][colEnd] = count[0];
  2091. count[0]++;
  2092. }
  2093. for (int i = colEnd - 1; i >= colStart; i--) {
  2094. matrix[rowEnd][i] = count[0];
  2095. count[0]++;
  2096. }
  2097. for (int i = rowEnd - 1; i >= rowStart + 1; i--) {
  2098. matrix[i][colStart] = count[0];
  2099. count[0]++;
  2100. }
  2101. }
  2102. }
  2103. /**
  2104. * https://oj.leetcode.com/problems/jump-game/
  2105. * https://oj.leetcode.com/submissions/detail/10203444/
  2106. */
  2107. public static boolean canJump(int[] A) {
  2108. if (A == null || A.length == 0) return true;
  2109. int max = A[0];
  2110. if (max >= A.length - 1) return true;
  2111. while (true) {
  2112. for (int i = 1; i <= max; i++) {
  2113. if (i + A[i] >= A.length - 1) return true;
  2114. if (i + A[i] > max) max = i + A[i];
  2115. }
  2116. return false;
  2117. }
  2118. }
  2119. /**
  2120. * https://oj.leetcode.com/problems/merge-intervals/
  2121. * http://www.programcreek.com/2012/12/leetcode-merge-intervals/
  2122. * http://www.darrensunny.me/leetcode-merge-intervals/
  2123. * https://oj.leetcode.com/submissions/detail/10215552/
  2124. */
  2125. public List<Interval> merge(List<Interval> intervals) {
  2126. if (intervals == null || intervals.size() <= 1) return intervals;
  2127. Interval[] items = intervals.toArray(new Interval[intervals.size()]);
  2128. Arrays.sort(items, new IntervalStartComparator());
  2129. List<Interval> result = new ArrayList<Interval>();
  2130. Interval item = items[0];
  2131. for (int i = 1; i < items.length; i++) {
  2132. if (items[i].start <= item.end) {
  2133. item.end = Math.max(item.end, items[i].end);
  2134. } else {
  2135. result.add(item);
  2136. item = items[i];
  2137. }
  2138. }
  2139. result.add(item);
  2140. return result;
  2141. }
  2142. static class IntervalStartComparator implements Comparator<Interval> {
  2143. public int compare(Interval a, Interval b) {
  2144. return new Integer(a.start).compareTo(new Integer(b.start));
  2145. }
  2146. }
  2147. public static class Interval {
  2148. int start;
  2149. int end;
  2150. Interval() {
  2151. start = 0;
  2152. end = 0;
  2153. }
  2154. Interval(int s, int e) {
  2155. start = s;
  2156. end = e;
  2157. }
  2158. }
  2159. /**
  2160. * https://oj.leetcode.com/problems/insert-interval/
  2161. * http://www.programcreek.com/2012/12/leetcode-insert-interval/
  2162. * http://www.darrensunny.me/leetcode-insert-interval/
  2163. * https://oj.leetcode.com/submissions/detail/10217871/
  2164. *
  2165. */
  2166. public static List<Interval> insert(List<Interval> intervals, Interval newInterval) {
  2167. if(newInterval == null) return intervals;
  2168. if(intervals == null) {
  2169. intervals = new ArrayList<Interval>();
  2170. }
  2171. if(intervals.isEmpty()){
  2172. intervals.add(newInterval);
  2173. return intervals;
  2174. }
  2175. Collections.sort(intervals, new IntervalStartComparator());
  2176. int size = intervals.size();
  2177. if(newInterval.end < intervals.get(0).start){
  2178. intervals.add(0, newInterval);
  2179. return intervals;
  2180. }
  2181. if(newInterval.start > intervals.get(size - 1).end){
  2182. intervals.add(size, newInterval);
  2183. return intervals;
  2184. }
  2185. int i = 0, j = 0;
  2186. while(i <= size - 1 && intervals.get(i).end < newInterval.start){
  2187. i++;
  2188. j++;
  2189. }
  2190. while(j <= size - 1 && intervals.get(j).start <= newInterval.end){
  2191. j++;
  2192. }
  2193. for(int k = i; k <= j - 1; k++){
  2194. newInterval.start = Math.min(newInterval.start, intervals.get(i).start);
  2195. newInterval.end = Math.max(newInterval.end, intervals.get(i).end);
  2196. intervals.remove(i);
  2197. }
  2198. intervals.add(i, newInterval);
  2199. return intervals;
  2200. }
  2201. /**
  2202. * https://oj.leetcode.com/problems/length-of-last-word/
  2203. * https://oj.leetcode.com/submissions/detail/10218507/
  2204. *
  2205. */
  2206. public int lengthOfLastWord(String s) {
  2207. int len = 0;
  2208. if(s == null || s.length() == 0)
  2209. return 0;
  2210. for(int i = s.length() - 1; i >= 0; i--){
  2211. if(s.charAt(i) != ' ')
  2212. len++;
  2213. else {
  2214. if(len > 0)
  2215. return len;
  2216. }
  2217. }
  2218. return len;
  2219. }
  2220. /**
  2221. * https://oj.leetcode.com/problems/merge-two-sorted-lists/
  2222. * https://oj.leetcode.com/submissions/detail/10316971/
  2223. */
  2224. public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
  2225. if (l1 == null) return l2;
  2226. if (l2 == null) return l1;
  2227. ListNode head = new ListNode(0);
  2228. ListNode n = head;
  2229. while (l1 != null || l2 != null) {
  2230. if (l1 == null) {
  2231. n.next = l2;
  2232. break;
  2233. } else if (l2 == null) {
  2234. n.next = l1;
  2235. break;
  2236. } else {
  2237. if (l1.val <= l2.val) {
  2238. n.next = l1;
  2239. l1 = l1.next;
  2240. } else {
  2241. n.next = l2;
  2242. l2 = l2.next;
  2243. }
  2244. n = n.next;
  2245. n.next = null;
  2246. }
  2247. }
  2248. return head.next;
  2249. }
  2250. /**
  2251. * https://oj.leetcode.com/problems/add-binary/
  2252. * https://oj.leetcode.com/submissions/detail/10317701/
  2253. */
  2254. public String addBinary(String a, String b) {
  2255. if (a == null || a.length() == 0) return b;
  2256. if (b == null || b.length() == 0) return a;
  2257. String c = "";
  2258. int index1 = a.length() - 1;
  2259. int index2 = b.length() - 1;
  2260. int carryOver = 0;
  2261. while (index1 >= 0 || index2 >= 0) {
  2262. if (index1 >= 0) {
  2263. carryOver += a.charAt(index1) - '0';
  2264. index1--;
  2265. }
  2266. if (index2 >= 0) {
  2267. carryOver += b.charAt(index2) - '0';
  2268. index2--;
  2269. }
  2270. c = carryOver % 2 + c;
  2271. carryOver = carryOver / 2;
  2272. }
  2273. if(carryOver > 0){
  2274. c = carryOver + c;
  2275. }
  2276. return c;
  2277. }
  2278. /**
  2279. * https://oj.leetcode.com/problems/valid-number/
  2280. * http://www.darrensunny.me/leetcode-valid-number/
  2281. * https://oj.leetcode.com/submissions/detail/10320818/
  2282. *
  2283. */
  2284. public static boolean isNumber(String s) {
  2285. if (s == null || s.trim().length() == 0) return false;
  2286. s = s.trim();
  2287. s = s.replaceAll(" ", "");
  2288. s = s.replaceAll("\t", "");
  2289. int signCount = 0;
  2290. int dotCount = 0;
  2291. int eCount = 0;
  2292. for (int i = 0; i < s.length(); i++) {
  2293. char c = s.charAt(i);
  2294. if ('0' <= c && '9' >= c)
  2295. continue;
  2296. else if (c == '+' || c == '-') {
  2297. if (signCount >= 2) return false;
  2298. if (i == 0 || s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E') {
  2299. signCount++;
  2300. continue;
  2301. } else
  2302. return false;
  2303. } else if (c == '.') {
  2304. if (dotCount > 0 || i == s.length() - 1)
  2305. return false;
  2306. else {
  2307. dotCount++;
  2308. continue;
  2309. }
  2310. } else if (c == 'e' || c == 'E') {
  2311. if (eCount > 0 || i == 0 || i == s.length() - 1)
  2312. return false;
  2313. else if (i > 0 && s.charAt(i - 1) == '.') {
  2314. return false;
  2315. } else {
  2316. eCount++;
  2317. continue;
  2318. }
  2319. } else {
  2320. return false;
  2321. }
  2322. }
  2323. return true;
  2324. }
  2325. /**
  2326. * https://oj.leetcode.com/problems/sqrtx/
  2327. * https://oj.leetcode.com/submissions/detail/10323137/
  2328. *
  2329. */
  2330. public static int sqrt(int x) {
  2331. double sRoot = 1.0;
  2332. while (Math.abs(x - sRoot * sRoot) >= 0.1) {
  2333. sRoot = (sRoot + x / sRoot) / 2.0;
  2334. }
  2335. return (int)sRoot;
  2336. }
  2337. /**
  2338. * https://oj.leetcode.com/problems/climbing-stairs/
  2339. * http://www.darrensunny.me/leetcode-climbing-stairs/
  2340. * https://oj.leetcode.com/submissions/detail/10544378/
  2341. *
  2342. */
  2343. public static int climbStairs(int n) {
  2344. if(n <= 1) return 1;
  2345. int r0 = 1;
  2346. int r1 = 1;
  2347. int r2 = r0 + r1;
  2348. for(int i = 2; i <= n; i++){
  2349. r2 = r0 + r1;
  2350. r0 = r1;
  2351. r1 = r2;
  2352. }
  2353. return r2;
  2354. }
  2355. public static int climbStairs2(int n) {
  2356. if (n <= 1) return 1;
  2357. List<String> result = new ArrayList<String>();
  2358. climbStairs(n, "", result);
  2359. return result.size();
  2360. }
  2361. private static void climbStairs(int n, String steps, List<String> result) {
  2362. if (n == 0) {
  2363. result.add(steps);
  2364. return;
  2365. } else if (n == 1) {
  2366. result.add(steps + "1");
  2367. return;
  2368. } else {
  2369. climbStairs(n - 1, steps + "1", result);
  2370. climbStairs(n - 2, steps + "2", result);
  2371. }
  2372. }
  2373. /**
  2374. * https://oj.leetcode.com/problems/simplify-path/
  2375. * http://www.darrensunny.me/leetcode-simplify-path/
  2376. * https://oj.leetcode.com/submissions/detail/10547086/
  2377. *
  2378. */
  2379. public static String simplifyPath(String path) {
  2380. if (path == null || path.trim().length() == 0)
  2381. return path;
  2382. path = path.trim();
  2383. Stack<String> stack = new Stack<String>();
  2384. String dir = "";
  2385. for (int i = 0; i < path.length(); i++) {
  2386. char c = path.charAt(i);
  2387. if (c == '/') {
  2388. if (dir.equals("..")) {
  2389. if (!stack.isEmpty())
  2390. stack.pop();
  2391. } else if (dir.length() > 0) {
  2392. if (!dir.equals("."))
  2393. stack.push(dir);
  2394. }
  2395. dir = "";
  2396. } else {
  2397. dir += c;
  2398. }
  2399. }
  2400. if (dir.equals("..")) {
  2401. if (!stack.isEmpty())
  2402. stack.pop();
  2403. } else if (dir.length() > 0) {
  2404. if (!dir.equals("."))
  2405. stack.push(dir);
  2406. }
  2407. String sPath = "";
  2408. while (!stack.isEmpty()) {
  2409. if (sPath.length() > 0) {
  2410. sPath = stack.pop() + "/" + sPath;
  2411. } else {
  2412. sPath = stack.pop();
  2413. }
  2414. }
  2415. sPath = "/" + sPath;
  2416. return sPath;
  2417. }
  2418. /**
  2419. * https://oj.leetcode.com/problems/set-matrix-zeroes/
  2420. * http://www.programcreek.com/2012/12/leetcode-set-matrix-zeroes-java/
  2421. *
  2422. */
  2423. public static void setZeroes(int[][] matrix) {
  2424. boolean firstRowZero = false;
  2425. boolean firstColumnZero = false;
  2426. //set first row and column zero or not
  2427. for (int i = 0; i < matrix.length; i++) {
  2428. if (matrix[i][0] == 0) {
  2429. firstColumnZero = true;
  2430. break;
  2431. }
  2432. }
  2433. for (int i = 0; i < matrix[0].length; i++) {
  2434. if (matrix[0][i] == 0) {
  2435. firstRowZero = true;
  2436. break;
  2437. }
  2438. }
  2439. //mark zeros on first row and column
  2440. for (int i = 1; i < matrix.length; i++) {
  2441. for (int j = 1; j < matrix[0].length; j++) {
  2442. if (matrix[i][j] == 0) {
  2443. matrix[i][0] = 0;
  2444. matrix[0][j] = 0;
  2445. }
  2446. }
  2447. }
  2448. //use mark to set elements
  2449. for (int i = 1; i < matrix.length; i++) {
  2450. for (int j = 1; j < matrix[0].length; j++) {
  2451. if (matrix[i][0] == 0 || matrix[0][j] == 0) {
  2452. matrix[i][j] = 0;
  2453. }
  2454. }
  2455. }
  2456. //set first column and row
  2457. if (firstColumnZero) {
  2458. for (int i = 0; i < matrix.length; i++)
  2459. matrix[i][0] = 0;
  2460. }
  2461. if (firstRowZero) {
  2462. for (int i = 0; i < matrix[0].length; i++)
  2463. matrix[0][i] = 0;
  2464. }
  2465. }
  2466. /**
  2467. * https://oj.leetcode.com/problems/search-a-2d-matrix/
  2468. * http://www.programcreek.com/2013/01/leetcode-search-a-2d-matrix-java/
  2469. * https://oj.leetcode.com/submissions/detail/10560534/
  2470. */
  2471. public static boolean searchMatrix(int[][] matrix, int target) {
  2472. if(matrix==null || matrix.length==0 || matrix[0].length==0)
  2473. return false;
  2474. int m = matrix.length;
  2475. int n = matrix[0].length;
  2476. int start = 0;
  2477. int end = m*n-1;
  2478. while(start<=end){
  2479. int mid=(start+end)/2;
  2480. int midX=mid/n;
  2481. int midY=mid%n;
  2482. if(matrix[midX][midY]==target)
  2483. return true;
  2484. if(matrix[midX][midY]<target){
  2485. start=mid+1;
  2486. }else{
  2487. end=mid-1;
  2488. }
  2489. }
  2490. return false;
  2491. }
  2492. public static boolean searchMatrix2(int[][] matrix, int target) {
  2493. if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
  2494. return false;
  2495. int m = matrix.length, n = matrix[0].length;
  2496. int lo = 0, hi = m - 1;
  2497. while(lo <= hi) {
  2498. if(target < matrix[lo][0] || target > matrix[hi][n-1])
  2499. return false;
  2500. int mid = lo + (hi - lo)/2;
  2501. if(target < matrix[mid][0]) hi = mid -1;
  2502. else if (target > matrix[mid][n-1]) lo = mid + 1;
  2503. else {
  2504. int clo = 0, chi = n - 1;
  2505. while(clo <= chi) {
  2506. int cmid = clo + (chi - clo)/2;
  2507. if(target < matrix[mid][cmid]) chi = cmid - 1;
  2508. else if (target > matrix[mid][cmid]) clo = cmid + 1;
  2509. else return true;
  2510. }
  2511. return false;
  2512. }
  2513. }
  2514. return false;
  2515. }
  2516. /**
  2517. * https://oj.leetcode.com/problems/sort-colors/
  2518. * http://www.darrensunny.me/leetcode-sort-colors/
  2519. * https://oj.leetcode.com/submissions/detail/10588033/
  2520. *
  2521. */
  2522. public static void sortColors(int[] A) {
  2523. if (A == null || A.length == 0) return;
  2524. int startZero = 0, startOne = 0, startTwo = 0, countZero = 0, countOne = 0, countThree = 0;
  2525. for (int i = 0; i < A.length; i++) {
  2526. if (A[i] == 0) {
  2527. int temp = A[i];
  2528. A[i] = A[startTwo];
  2529. A[startTwo] = A[startOne];
  2530. A[startOne] = temp;
  2531. countZero++;
  2532. startTwo++;
  2533. startOne++;
  2534. } else if (A[i] == 1) {
  2535. int temp = A[i];
  2536. A[i] = A[startTwo];
  2537. A[startTwo] = temp;
  2538. countOne++;
  2539. startTwo++;
  2540. } else {
  2541. countThree++;
  2542. }
  2543. }
  2544. }
  2545. /**
  2546. * https://oj.leetcode.com/problems/combinations/
  2547. * http://www.darrensunny.me/leetcode-combinations/
  2548. * https://oj.leetcode.com/submissions/detail/10591173/
  2549. *
  2550. */
  2551. public static List<List<Integer>> combine(int n, int k) {
  2552. List<List<Integer>> result = new ArrayList<List<Integer>>();
  2553. List<Integer> list = new ArrayList<Integer>();
  2554. combine(result, list, 1, k, n);
  2555. return result;
  2556. }
  2557. private static void combine(List<List<Integer>> result, List<Integer> list, int start, int k, int n) {
  2558. if (k == 0) {
  2559. result.add(list);
  2560. return;
  2561. }
  2562. for (int i = start; i <= n - k + 1; i++) {
  2563. list.add(i);
  2564. combine(result, new ArrayList<Integer>(list), i + 1, k - 1, n);
  2565. list.remove(new Integer(i));
  2566. }
  2567. }
  2568. /**
  2569. * https://oj.leetcode.com/problems/subsets/
  2570. * http://www.darrensunny.me/leetcode-subsets/
  2571. * https://oj.leetcode.com/submissions/detail/10592291/
  2572. */
  2573. public static List<List<Integer>> subsets(int[] S) {
  2574. List<List<Integer>> result = new ArrayList<List<Integer>>();
  2575. List<Integer> list = new ArrayList<Integer>();
  2576. result.add(list);
  2577. if (S == null || S.length == 0) return result;
  2578. Arrays.sort(S);
  2579. for (int i = 1; i <= S.length; i++) {
  2580. combine(result, new ArrayList<Integer>(), S, 1, i, S.length);
  2581. }
  2582. return result;
  2583. }
  2584. //Create the set by choose k (1 to S.length) out of n numbers.
  2585. private static void combine(List<List<Integer>> result, List<Integer> list, int[] S, int start, int k, int n) {
  2586. if (k == 0) {
  2587. result.add(list);
  2588. return;
  2589. }
  2590. //For a certain k, the first number can only go up to index n - k, because there need to be k number ascending order
  2591. // and (n-1) - (n-k+1) + 1 = k numbers, if you start after n - k, there will not be enough numbers.
  2592. for (int i = start; i <= n - k + 1; i++) {
  2593. list.add(S[i - 1]);
  2594. combine(result, new ArrayList<Integer>(list), S, i + 1, k - 1, n);
  2595. list.remove(new Integer(S[i - 1]));
  2596. }
  2597. }
  2598. /**
  2599. * https://oj.leetcode.com/problems/subsets-ii/
  2600. * https://oj.leetcode.com/submissions/detail/11293407/
  2601. *
  2602. */
  2603. public static List<List<Integer>> subsetsWithDup(int[] num) {
  2604. List<List<Integer>> result = new ArrayList<List<Integer>>();
  2605. List<Integer> list = new ArrayList<Integer>();
  2606. result.add(list);
  2607. if(num == null || num.length == 0)
  2608. return result;
  2609. Arrays.sort(num);
  2610. for(int i = 1; i <= num.length; i++){
  2611. combineWithDup(result, list, num, 1, i, num.length);
  2612. }
  2613. return result;
  2614. }
  2615. private static void combineWithDup(List<List<Integer>> result, List<Integer> list, int[] S, int start, int k, int n) {
  2616. if (k == 0) {
  2617. result.add(list);
  2618. return;
  2619. }
  2620. //if i > start, S[i-1] == S[i-2] continue
  2621. for (int i = start; i <= n - k + 1; i++) {
  2622. if(i > start && S[i- 1] == S[i - 2])
  2623. continue;
  2624. else {
  2625. list.add(S[i - 1]);
  2626. combineWithDup(result, new ArrayList<Integer>(list), S, i + 1, k - 1, n);
  2627. list.remove(new Integer(S[i - 1]));
  2628. }
  2629. }
  2630. }
  2631. /**
  2632. * https://oj.leetcode.com/problems/minimum-window-substring/
  2633. * http://leetcode.com/2010/11/finding-minimum-window-in-s-which.html
  2634. * https://oj.leetcode.com/submissions/detail/10653929/
  2635. *
  2636. */
  2637. public static String minWindow(String S, String T) {
  2638. String result = "";
  2639. if (S == null || T == null || S.length() == 0 || T.length() == 0)
  2640. return "";
  2641. Map<Character, Integer> countMap = countMap(T);
  2642. Map<Character, Integer> map = new HashMap<Character, Integer>();
  2643. Map<Character, Integer> temp = new HashMap<Character, Integer>(countMap);
  2644. int i = 0, j = 0;
  2645. //Advanced i j to the first letter that is in the T
  2646. while (i < S.length() && j < S.length() && !countMap.containsKey(S.charAt(i))) {
  2647. i++;
  2648. j++;
  2649. }
  2650. // Advanced j to to the position that S.substring(i, j) contains T
  2651. while (!temp.isEmpty()) {
  2652. //If j reaches the end of S return
  2653. if (j == S.length()) return result;
  2654. char c = S.charAt(j);
  2655. if (countMap.containsKey(c)) {
  2656. if (map.containsKey(c))
  2657. map.put(c, map.get(c) + 1);
  2658. else
  2659. map.put(c, 1);
  2660. if (temp.containsKey(c)) {
  2661. if (temp.get(c) > 1)
  2662. temp.put(c, temp.get(c) - 1);
  2663. else
  2664. temp.remove(c);
  2665. }
  2666. }
  2667. j++;
  2668. }
  2669. result = S.substring(i, j);
  2670. while (true) {
  2671. //Advance i to the position that S.substring(i, j) still has all characters in T
  2672. //until count of S.charAt(i) is less than it is in countMap
  2673. while (i < j) {
  2674. char c = S.charAt(i);
  2675. if (map.containsKey(c)) {
  2676. map.put(c, map.get(c) - 1);
  2677. if (map.get(c) < countMap.get(c)) {
  2678. if (j - i < result.length()) {
  2679. result = S.substring(i, j);
  2680. }
  2681. break;
  2682. }
  2683. }
  2684. i++;
  2685. }
  2686. char c = S.charAt(i);
  2687. i++;
  2688. while (i < j && !countMap.containsKey(S.charAt(i))) i++;
  2689. while (j < S.length() && S.charAt(j) != c) {
  2690. char b = S.charAt(j);
  2691. if (map.containsKey(b)) {
  2692. map.put(b, map.get(b) + 1);
  2693. }
  2694. j++;
  2695. }
  2696. if (j < S.length()) {
  2697. map.put(c, map.get(c) + 1);
  2698. j++;
  2699. if (j - i < result.length()) {
  2700. result = S.substring(i, j);
  2701. }
  2702. } else {
  2703. break;
  2704. }
  2705. }
  2706. return result;
  2707. }
  2708. private static Map<Character, Integer> countMap(String s) {
  2709. Map<Character, Integer> map = new HashMap<Character, Integer>();
  2710. for (int i = 0; i < s.length(); i++) {
  2711. char c = s.charAt(i);
  2712. if (map.containsKey(c))
  2713. map.put(c, map.get(c) + 1);
  2714. else
  2715. map.put(c, 1);
  2716. }
  2717. return map;
  2718. }
  2719. /**
  2720. * https://oj.leetcode.com/problems/word-search/
  2721. * https://oj.leetcode.com/submissions/detail/10721616/
  2722. *
  2723. */
  2724. public static boolean exist(char[][] board, String word) {
  2725. if(board == null || word == null || board.length == 0 || board[0].length == 0 || word.length() == 0)
  2726. return false;
  2727. List<Position> startPositions = getStartPositions(board, word);
  2728. for(Position p : startPositions) {
  2729. Map<Position, Boolean> map = new HashMap<Position, Boolean>();
  2730. map.put(p, Boolean.TRUE);
  2731. if(exist(board, p, map, word.substring(1)))
  2732. return true;
  2733. }
  2734. return false;
  2735. }
  2736. private static boolean exist(char[][] board, Position p, Map<Position, Boolean> map, String word) {
  2737. if(word.length() == 0) return true;
  2738. char c = word.charAt(0);
  2739. int i = p.i, j = p.j;
  2740. Position nextP = new Position(i, j - 1);
  2741. if(isAvailable(board, nextP, map, c)) {
  2742. map.put(nextP, Boolean.TRUE);
  2743. if(exist(board, nextP, map, word.substring(1)))
  2744. return true;
  2745. map.remove(nextP);
  2746. }
  2747. nextP = new Position(i, j + 1);
  2748. if(isAvailable(board, nextP, map, c)) {
  2749. map.put(nextP, Boolean.TRUE);
  2750. if(exist(board, nextP, map, word.substring(1)))
  2751. return true;
  2752. map.remove(nextP);
  2753. }
  2754. nextP = new Position(i - 1, j);
  2755. if(isAvailable(board, nextP, map, c)) {
  2756. map.put(nextP, Boolean.TRUE);
  2757. if(exist(board, nextP, map, word.substring(1)))
  2758. return true;
  2759. map.remove(nextP);
  2760. }
  2761. nextP = new Position(i + 1, j);
  2762. if(isAvailable(board, nextP, map, c)) {
  2763. map.put(nextP, Boolean.TRUE);
  2764. if(exist(board, nextP, map, word.substring(1)))
  2765. return true;
  2766. map.remove(nextP);
  2767. }
  2768. return false;
  2769. }
  2770. private static boolean isAvailable(char[][] board, Position p, Map<Position, Boolean> map, char c){
  2771. return p.i >= 0 && p.i < board.length && p.j >= 0 && p.j < board[0].length
  2772. && !map.containsKey(p) && board[p.i][p.j] == c;
  2773. }
  2774. private static List<Position> getStartPositions(char[][] board, String word) {
  2775. List<Position> positions = new ArrayList<Position>();
  2776. char c = word.charAt(0);
  2777. for(int i = 0; i < board.length; i++)
  2778. for(int j = 0; j < board[0].length; j++)
  2779. if(board[i][j] == c)
  2780. positions.add(new Position(i, j));
  2781. return positions;
  2782. }
  2783. private static class Position {
  2784. int i;
  2785. int j;
  2786. Position(int i, int j) {
  2787. this.i = i;
  2788. this.j = j;
  2789. }
  2790. public boolean equals(Object p) {
  2791. if(p instanceof Position)
  2792. return this.i == ((Position)p).i && this.j == ((Position)p).j;
  2793. else
  2794. return false;
  2795. }
  2796. public int hashCode()
  2797. {
  2798. return "row".hashCode() * i + "col".hashCode() * j;
  2799. }
  2800. }
  2801. /**
  2802. * https://oj.leetcode.com/problems/remove-duplicates-from-sorted-list/
  2803. * https://oj.leetcode.com/submissions/detail/10902450/
  2804. *
  2805. */
  2806. public ListNode deleteDuplicates(ListNode head) {
  2807. if(head == null || head.next == null) return head;
  2808. ListNode n = head;
  2809. while(n != null) {
  2810. while(n.next != null && n.next.val == n.val)
  2811. n.next = n.next.next;
  2812. n = n.next;
  2813. }
  2814. return head;
  2815. }
  2816. // public ListNode deleteDuplicates(ListNode head) {
  2817. // if (head == null)
  2818. // return head;
  2819. // ListNode pre = head;
  2820. // ListNode cur = head.next;
  2821. // while (cur != null) {
  2822. // if (cur.val == pre.val)
  2823. // pre.next = cur.next;
  2824. // else
  2825. // pre = cur;
  2826. // cur = cur.next;
  2827. // }
  2828. // return head;
  2829. // }
  2830. /**
  2831. * https://oj.leetcode.com/problems/remove-duplicates-from-sorted-list-ii/
  2832. * https://oj.leetcode.com/submissions/detail/10903116/
  2833. *
  2834. */
  2835. public ListNode deleteDuplicates2(ListNode head) {
  2836. if (head == null || head.next == null)
  2837. return head;
  2838. ListNode s = new ListNode(0);
  2839. ListNode p = s;
  2840. ListNode n = head;
  2841. while (n != null) {
  2842. int count = 1;
  2843. while (n.next != null && n.next.val == n.val) {
  2844. n.next = n.next.next;
  2845. count++;
  2846. }
  2847. if (count == 1) {
  2848. p.next = n;
  2849. p = n;
  2850. n = n.next;
  2851. p.next = null;
  2852. } else {
  2853. n = n.next;
  2854. }
  2855. }
  2856. return s.next;
  2857. }
  2858. /**
  2859. * https://oj.leetcode.com/problems/largest-rectangle-in-histogram/
  2860. * http://www.geeksforgeeks.org/largest-rectangle-under-histogram/
  2861. * https://oj.leetcode.com/submissions/detail/10906717/
  2862. *
  2863. */
  2864. public static int largestRectangleArea(int[] height) {
  2865. if(height == null || height.length == 0)
  2866. return 0;
  2867. if(height.length == 1)
  2868. return height[0];
  2869. Rectangle[] rectangles = new Rectangle[height.length];
  2870. rectangles[0] = new Rectangle(height[0]);
  2871. rectangles[0].left = -1;
  2872. for(int i = 1; i < height.length; i++){
  2873. rectangles[i] = new Rectangle(height[i]);
  2874. if(height[i] == 0)
  2875. rectangles[i].left = i - 1;
  2876. int j = i - 1;
  2877. while(j>= 0 && height[j] > height[i])
  2878. j--;
  2879. if(j == -1 || height[j] != height[i])
  2880. rectangles[i].left = j;
  2881. else
  2882. rectangles[i].left = rectangles[j].left;
  2883. }
  2884. rectangles[height.length-1].right = height.length;
  2885. for(int i = height.length-2; i>=0; i--){
  2886. if(height[i] == 0)
  2887. rectangles[i].right = i;
  2888. int j = i + 1;
  2889. while(j <= height.length -1 && height[j] > height[i])
  2890. j++;
  2891. if(j == height.length || height[j] != height[i])
  2892. rectangles[i].right = j;
  2893. else
  2894. rectangles[i].right = rectangles[j].right;
  2895. }
  2896. int max = 0;
  2897. for(int i = 0; i < height.length; i++){
  2898. int area = rectangles[i].height * (rectangles[i].right - rectangles[i].left - 1);
  2899. if(area > max)
  2900. max = area;
  2901. }
  2902. return max;
  2903. }
  2904. private static class Rectangle {
  2905. private int left;
  2906. private int right;
  2907. private int height;
  2908. Rectangle(int height) {
  2909. this.height = height;
  2910. }
  2911. }
  2912. /**
  2913. * https://oj.leetcode.com/problems/maximal-rectangle/
  2914. * https://oj.leetcode.com/submissions/detail/10961591/
  2915. *
  2916. *
  2917. */
  2918. public static int maximalRectangle(char[][] matrix) {
  2919. if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
  2920. return 0;
  2921. return maxRect(matrix, 0);
  2922. }
  2923. private static void populateOnes(char[][] matrix, boolean[] a, int nextRow) {
  2924. for (int i = 0; i < a.length; i++) {
  2925. if (!(a[i] && matrix[nextRow][i] == '1'))
  2926. a[i] = false;
  2927. }
  2928. }
  2929. private static int longestOnes(boolean[] a) {
  2930. int width = 0, max = 0;
  2931. boolean IN = false;
  2932. for (int i = 0; i < a.length; i++) {
  2933. if (a[i]) {
  2934. if (!IN) {
  2935. IN = true;
  2936. width = 1;
  2937. } else {
  2938. width++;
  2939. }
  2940. if (width > max)
  2941. max = width;
  2942. } else {
  2943. if (IN) {
  2944. IN = false;
  2945. if (width > max)
  2946. max = width;
  2947. }
  2948. width = 0;
  2949. }
  2950. }
  2951. return max;
  2952. }
  2953. private static int maxRect(char[][] matrix, int startRow) {
  2954. if (startRow == matrix.length) return 0;
  2955. boolean[] a = new boolean[matrix[0].length];
  2956. for (int i = 0; i < a.length; i++)
  2957. a[i] = true;
  2958. int max = 0;
  2959. for (int j = startRow; j < matrix.length; j++) {
  2960. populateOnes(matrix, a, j);
  2961. int width = longestOnes(a);
  2962. int area = width * (j - startRow + 1);
  2963. max = Math.max(max, area);
  2964. }
  2965. return Math.max(max, maxRect(matrix, startRow + 1));
  2966. }
  2967. /**
  2968. * https://oj.leetcode.com/problems/partition-list/
  2969. * https://oj.leetcode.com/submissions/detail/10963337/
  2970. *
  2971. */
  2972. public ListNode partition(ListNode head, int x) {
  2973. if(head == null || head.next == null)
  2974. return head;
  2975. ListNode l1 = new ListNode(0);
  2976. ListNode l2 = new ListNode(0);
  2977. ListNode t1 = l1;
  2978. ListNode t2 = l2;
  2979. ListNode p = head;
  2980. ListNode q = head;
  2981. while(p != null) {
  2982. if(p.val < x) {
  2983. while(q.next != null && q.next.val < x){
  2984. q = q.next;
  2985. }
  2986. t1.next = p;
  2987. t1 = q;
  2988. q = q.next;
  2989. t1.next = null;
  2990. } else {
  2991. while(q.next != null && q.next.val >= x) {
  2992. q = q.next;
  2993. }
  2994. t2.next = p;
  2995. t2 = q;
  2996. q = q.next;
  2997. t2.next = null;
  2998. }
  2999. p = q;
  3000. }
  3001. t1.next = l2.next;
  3002. return l1.next;
  3003. }
  3004. /**
  3005. * https://oj.leetcode.com/problems/scramble-string/
  3006. * https://oj.leetcode.com/submissions/detail/10967982/
  3007. */
  3008. public static boolean isScramble(String s1, String s2) {
  3009. if (s1 == null || s2 == null)
  3010. return false;
  3011. if (s1.length() != s2.length())
  3012. return false;
  3013. if (s1.equals(s2))
  3014. return true;
  3015. if(!isAnagram2(s1, s2))
  3016. return false;
  3017. for (int i = 1; i < s1.length(); i++) {
  3018. String s1Left=s1.substring(0, i);
  3019. String s1Right=s1.substring(i);
  3020. String s2Left=s2.substring(0,i);
  3021. String s2Right=s2.substring(i);
  3022. if (isScramble(s1Left, s2Left)&&isScramble(s1Right,s2Right)){
  3023. return true;
  3024. }
  3025. s2Left=s2.substring(s2.length()-i);
  3026. s2Right=s2.substring(0, s2.length()-i);
  3027. if (isScramble(s1Left, s2Left)&&isScramble(s1Right,s2Right)){
  3028. return true;
  3029. }
  3030. }
  3031. return false;
  3032. }
  3033. private static boolean isAnagram2(String s1, String s2) {
  3034. char[] a1 = s1.toCharArray();
  3035. Arrays.sort(a1);
  3036. char[] a2 = s2.toCharArray();
  3037. Arrays.sort(a2);
  3038. for (int i = 0; i < a1.length; i++) {
  3039. if (a1[i] != a2[i])
  3040. return false;
  3041. }
  3042. return true;
  3043. }
  3044. public static boolean isScramble3(String s1, String s2) {
  3045. if( s1==null||s2==null){
  3046. return false;
  3047. }
  3048. if (s1.length()==0){
  3049. return s2.length()==0;
  3050. }
  3051. if (s1.length()!=s2.length()){
  3052. return false;
  3053. }
  3054. if (s1.equals(s2)){
  3055. return true;
  3056. }
  3057. if(!isAnagram2(s1, s2))
  3058. return false;
  3059. for (int i =1; i<s1.length(); i++){
  3060. String s1Left=s1.substring(0, i);
  3061. String s1Right=s1.substring(i);
  3062. String s2Left=s2.substring(0,i);
  3063. String s2Right=s2.substring(i);
  3064. if (isScramble3(s1Left, s2Left)&&isScramble3(s1Right,s2Right)){
  3065. return true;
  3066. }
  3067. s2Left=s2.substring(s2.length()-i);
  3068. s2Right=s2.substring(0, s2.length()-i);
  3069. if (isScramble3(s1Left, s2Left)&&isScramble3(s1Right,s2Right)){
  3070. return true;
  3071. }
  3072. }
  3073. return false;
  3074. }
  3075. /**
  3076. * https://oj.leetcode.com/problems/merge-sorted-array/
  3077. * https://oj.leetcode.com/submissions/detail/11054578/
  3078. */
  3079. public void merge(int A[], int m, int B[], int n) {
  3080. if(A == null || B == null || n == 0) return;
  3081. for(int k = m + n -1; k >= n; k--)
  3082. A[k] = A[k - n];
  3083. int i = n, j = 0;
  3084. for(int k = 0; k < m + n; k++){
  3085. if(i > m + n -1) A[k] = B[j++];
  3086. else if(j > n - 1) A[k] = A[i++];
  3087. else if (A[i] <= B[j]) A[k] = A[i++];
  3088. else A[k] = B[j++];
  3089. }
  3090. }
  3091. /**
  3092. * https://oj.leetcode.com/problems/gray-code/
  3093. * https://oj.leetcode.com/submissions/detail/11056385/
  3094. */
  3095. public static List<Integer> grayCode(int n) {
  3096. List<Integer> result = new ArrayList<Integer>();
  3097. if(n < 0) return result;
  3098. if(n == 0){
  3099. result.add(0);
  3100. return result;
  3101. } else if(n == 1){
  3102. result.add(0);
  3103. result.add(1);
  3104. return result;
  3105. } else {
  3106. result = grayCode(n - 1);
  3107. Stack<Integer> stack = new Stack<Integer>();
  3108. for (Integer x : result)
  3109. stack.push(x);
  3110. ;
  3111. int mask = 1 << (n-1);
  3112. while (!stack.isEmpty())
  3113. result.add(mask | stack.pop());
  3114. return result;
  3115. }
  3116. }
  3117. private static int numberOfBits(int n){
  3118. int r = 1, x = 1;
  3119. while(x < n){
  3120. x <<= 1;
  3121. r++;
  3122. }
  3123. return r;
  3124. }
  3125. /**
  3126. * https://oj.leetcode.com/problems/decode-ways/
  3127. * https://oj.leetcode.com/submissions/detail/11121184/
  3128. * https://oj.leetcode.com/submissions/detail/11122075/
  3129. *
  3130. */
  3131. public static int numDecodings(String s) {
  3132. if (s == null || s.length() == 0)
  3133. return 0;
  3134. int r1 = 0, r2 = 0, r = 0;
  3135. r1 = checkOne(s.charAt(0));
  3136. if (r1 == 0 || s.length() == 1)
  3137. return r1;
  3138. char c1 = s.charAt(0), c2 = s.charAt(1);
  3139. r2 = checkOne(c1) * checkOne(c2) + checkTwo(c1, c2);
  3140. if (r2 == 0 || s.length() == 2)
  3141. return r2;
  3142. for (int i = 3; i <= s.length(); i++) {
  3143. int num1 = checkTwo(s.charAt(i - 2), s.charAt(i - 1));
  3144. int num2 = checkOne(s.charAt(i - 1));
  3145. r = num1 * r1 + num2 * r2;
  3146. // System.out.println(
  3147. // "decoding i=" + i + ", " + s.substring(i - 2, i) + ", " + s.substring(i - 1, i) + ",num1=" + num1
  3148. // + ",num2=" + num2 + ",r1=" + r1 + ",r2=" + r2 + ",r=" + r);
  3149. r1 = r2;
  3150. r2 = r;
  3151. }
  3152. return r;
  3153. }
  3154. private static int checkOne(char c) {
  3155. return (c >= '1' && c <= '9') ? 1 : 0;
  3156. }
  3157. private static int checkTwo(char c1, char c2) {
  3158. return (c1 == '1' || (c1 == '2' && c2 <= '6')) ? 1 : 0;
  3159. }
  3160. /**
  3161. * https://oj.leetcode.com/problems/reverse-linked-list-ii/
  3162. * https://oj.leetcode.com/submissions/detail/11297124/
  3163. *
  3164. */
  3165. public static ListNode reverseBetween(ListNode head, int m, int n) {
  3166. if(head == null || m == n) return head;
  3167. if(m == 1) {
  3168. return reverseBetweenHelper(head, 1, n);
  3169. } else {
  3170. ListNode oldHead = head;
  3171. ListNode last = head;
  3172. head = head.next;
  3173. int i = 2;
  3174. while(i < m){
  3175. last = last.next;
  3176. head = head.next;
  3177. i++;
  3178. }
  3179. last.next = reverseBetweenHelper(head, m, n);
  3180. return oldHead;
  3181. }
  3182. }
  3183. private static ListNode reverseBetweenHelper(ListNode head, int i, int n) {
  3184. ListNode r = null;
  3185. ListNode last = head;
  3186. while(i <= n){
  3187. ListNode p = head;
  3188. head = head.next;
  3189. p.next = r;
  3190. r = p;
  3191. i++;
  3192. }
  3193. last.next = head;
  3194. return r;
  3195. }
  3196. /**
  3197. * https://oj.leetcode.com/problems/restore-ip-addresses/
  3198. * https://oj.leetcode.com/submissions/detail/11300516/
  3199. * validate ip 0, 0 - 255, can not have digits starts with 0 unless it is single digit 0
  3200. *
  3201. */
  3202. public static List<String> restoreIpAddresses(String s) {
  3203. List<String> result = new ArrayList<String>();
  3204. if(s == null || s.length() < 4)
  3205. return result;
  3206. restoreIp(result, "", s, 3);
  3207. return result;
  3208. }
  3209. private static void restoreIp(List<String> result, String ip, String s, int n){
  3210. if(s.length() == 0 || s.length() > (n+1) * 3) return;
  3211. if(n == 0) {
  3212. if(s.length() > 1 && s.charAt(0) == '0')
  3213. return;
  3214. else if(Integer.parseInt(s) >= 0 && Integer.parseInt(s) <= 255)
  3215. result.add(ip + "." + s);
  3216. return;
  3217. }
  3218. for(int i = 1; i <=3; i++){
  3219. if(i > 1 && s.charAt(0) == '0'){
  3220. return;
  3221. } else if(s.length() >= i + 1 && Integer.parseInt(s.substring(0, i)) >= 0 && Integer.parseInt(s.substring(0, i)) <= 255) {
  3222. if(ip.length() > 0)
  3223. restoreIp(result, ip + "." + s.substring(0, i), s.substring(i), n - 1);
  3224. else
  3225. restoreIp(result, s.substring(0, i), s.substring(i), n - 1);
  3226. }
  3227. }
  3228. }
  3229. /**
  3230. * https://oj.leetcode.com/problems/binary-tree-inorder-traversal/
  3231. * http://www.programcreek.com/2012/12/leetcode-solution-of-binary-tree-inorder-traversal-in-java/
  3232. * https://oj.leetcode.com/submissions/detail/11302672/
  3233. *
  3234. */
  3235. public List<Integer> inorderTraversal(TreeNode root) {
  3236. List<Integer> list = new ArrayList<Integer>();
  3237. inorder(root, list);
  3238. return list;
  3239. }
  3240. private static void printTreeNode(TreeNode root) {
  3241. if(root == null) return;
  3242. System.out.print(root.val + " ");
  3243. printTreeNode(root.left);
  3244. printTreeNode(root.right);
  3245. }
  3246. private static void inorder(TreeNode root, List<Integer> list){
  3247. if(root == null) return;
  3248. inorder(root.left, list);
  3249. list.add(root.val);
  3250. inorder(root.right, list);
  3251. }
  3252. /**
  3253. * https://oj.leetcode.com/problems/unique-binary-search-trees/
  3254. * http://www.lifeincode.net/programming/leetcode-unique-binary-search-trees-i-and-ii-java/
  3255. * https://oj.leetcode.com/submissions/detail/11304512/
  3256. *
  3257. */
  3258. public static int numTrees(int n) {
  3259. if (n <= 0) return 0;
  3260. if (n == 1) return 1;
  3261. Map<Integer, Integer> map = new HashMap<Integer, Integer>();
  3262. map.put(0, 1);
  3263. map.put(1, 1);
  3264. for (int i = 2; i <= n; i++) {
  3265. int num = 0;
  3266. for (int j = 1; j <= i; j++) {
  3267. int left = map.get(j - 1);
  3268. int right = map.get(i - j);
  3269. num += left * right;
  3270. }
  3271. map.put(i, num);
  3272. }
  3273. return map.get(n);
  3274. }
  3275. /**
  3276. * https://oj.leetcode.com/problems/unique-binary-search-trees-ii/
  3277. * http://www.lifeincode.net/programming/leetcode-unique-binary-search-trees-i-and-ii-java/
  3278. * https://oj.leetcode.com/submissions/detail/11313452/
  3279. * https://oj.leetcode.com/submissions/detail/11313492/
  3280. *
  3281. */
  3282. public static List<TreeNode> generateTrees(int n) {
  3283. List<TreeNode> result = new ArrayList<TreeNode>();
  3284. if (n <= 0) {
  3285. result.add(null);
  3286. return result;
  3287. }
  3288. ;
  3289. result.add(new TreeNode(1));
  3290. if (n == 1) return result;
  3291. Map<Integer, List<TreeNode>> map = new HashMap<Integer, List<TreeNode>>();
  3292. map.put(1, result);
  3293. for (int i = 2; i <= n; i++) {
  3294. List<TreeNode> list = new ArrayList<TreeNode>();
  3295. for (int j = 1; j <= i; j++) {
  3296. List<TreeNode> temp = map.get(j - 1);
  3297. List<TreeNode> left = new ArrayList<TreeNode>();
  3298. if (temp != null) {
  3299. left.addAll(temp);
  3300. } else {
  3301. left.add(null);
  3302. }
  3303. temp = map.get(i - j);
  3304. List<TreeNode> right = new ArrayList<TreeNode>();
  3305. if (temp != null) {
  3306. for (TreeNode t : temp) {
  3307. right.add(adjustTreeNode(t, j));
  3308. }
  3309. } else {
  3310. right.add(null);
  3311. }
  3312. for (TreeNode l : left) {
  3313. for (TreeNode r : right) {
  3314. TreeNode node = new TreeNode(j);
  3315. node.left = l;
  3316. node.right = r;
  3317. list.add(node);
  3318. }
  3319. }
  3320. }
  3321. map.put(i, list);
  3322. }
  3323. return map.get(n);
  3324. }
  3325. private static TreeNode adjustTreeNode(TreeNode n, int x) {
  3326. if (n == null) return n;
  3327. TreeNode root = new TreeNode(n.val + x);
  3328. root.left = adjustTreeNode(n.left, x);
  3329. root.right = adjustTreeNode(n.right, x);
  3330. return root;
  3331. }
  3332. /**
  3333. * https://oj.leetcode.com/problems/interleaving-string/
  3334. * http://yucoding.blogspot.com/2013/01/leetcode-question-27-interleaving-string.html
  3335. * https://oj.leetcode.com/submissions/detail/11435610/
  3336. *
  3337. */
  3338. public static boolean isInterleave(String s1, String s2, String s3) {
  3339. if (s1 == null || s2 == null || s3 == null)
  3340. return false;
  3341. int len1 = s1.length();
  3342. int len2 = s2.length();
  3343. int len3 = s3.length();
  3344. if (len1 + len2 != len3)
  3345. return false;
  3346. if (s1.length() == 0)
  3347. return s2.equals(s3);
  3348. if (s2.length() == 0)
  3349. return s1.equals(s3);
  3350. if (s1.charAt(len1 - 1) != s3.charAt(len3 - 1) && s2.charAt(len2 - 1) != s3.charAt(len3 - 1))
  3351. return false;
  3352. Map<String, Boolean> map = new HashMap<String, Boolean>();
  3353. return isInterleave(map, s1, s2, s3);
  3354. }
  3355. public static boolean isInterleave(Map<String, Boolean> map, String s1, String s2, String s3) {
  3356. int len1 = s1.length();
  3357. int len2 = s2.length();
  3358. Boolean b = false;
  3359. if (s1.length() == 0)
  3360. return s2.equals(s3);
  3361. if (s2.length() == 0)
  3362. return s1.equals(s3);
  3363. if (s1.charAt(0) == s3.charAt(0)) {
  3364. String key = (len1 - 1) + "_" + len2;
  3365. b = map.get(key);
  3366. if (b == null) {
  3367. b = isInterleave(map, s1.substring(1), s2, s3.substring(1));
  3368. map.put(key, b);
  3369. }
  3370. if (b)
  3371. return true;
  3372. }
  3373. if (s2.charAt(0) == s3.charAt(0)) {
  3374. String key = len1 + "_" + (len2 - 1);
  3375. b = map.get(key);
  3376. if (b == null) {
  3377. b = isInterleave(map, s1, s2.substring(1), s3.substring(1));
  3378. map.put(key, b);
  3379. }
  3380. if (b)
  3381. return true;
  3382. }
  3383. map.put(len1 + "_" + len2, false);
  3384. return false;
  3385. }
  3386. /**
  3387. * https://oj.leetcode.com/problems/validate-binary-search-tree/
  3388. * http://www.programcreek.com/2012/12/leetcode-validate-binary-search-tree-java/
  3389. * https://oj.leetcode.com/submissions/detail/11691349/
  3390. *
  3391. */
  3392. public boolean isValidBST(TreeNode root) {
  3393. if (root == null)
  3394. return true;
  3395. if (root.left != null) {
  3396. if (root.left.val >= root.val)
  3397. return false;
  3398. if (max(root.left) >= root.val)
  3399. return false;
  3400. if (!isValidBST(root.left))
  3401. return false;
  3402. }
  3403. if (root.right != null) {
  3404. if (root.right.val <= root.val)
  3405. return false;
  3406. if (min(root.right) <= root.val)
  3407. return false;
  3408. if (!isValidBST(root.right))
  3409. return false;
  3410. }
  3411. return true;
  3412. }
  3413. private int max(TreeNode root) {
  3414. int max = root.val;
  3415. while (root.right != null) {
  3416. max = Math.max(root.right.val, max);
  3417. root = root.right;
  3418. }
  3419. return max;
  3420. }
  3421. private int min(TreeNode root) {
  3422. int min = root.val;
  3423. while (root.left != null) {
  3424. min = Math.min(root.left.val, min);
  3425. root = root.left;
  3426. }
  3427. return min;
  3428. }
  3429. /**
  3430. * https://oj.leetcode.com/problems/recover-binary-search-tree/
  3431. * https://oj.leetcode.com/submissions/detail/11718530/
  3432. *
  3433. */
  3434. public static void recoverTree(TreeNode root) {
  3435. if (root == null)
  3436. return;
  3437. TreeNode[] nodes = new TreeNode[4];
  3438. recoverTree(root, nodes);
  3439. swap(nodes[2], nodes[3]);
  3440. }
  3441. /*
  3442. * nodes nodes[0] prev, nodes[1] next
  3443. * nodes[2] first bad node (prev > next)
  3444. * nodes[3] second bad node (prev > next)
  3445. */
  3446. private static void recoverTree(TreeNode root, TreeNode[] nodes) {
  3447. if (root == null)
  3448. return;
  3449. recoverTree(root.left, nodes);
  3450. nodes[0] = nodes[1];
  3451. nodes[1] = root;
  3452. if (nodes[2] == null) {
  3453. if (nodes[0] != null && nodes[1] != null && nodes[0].val > nodes[1].val) {
  3454. nodes[2] = nodes[0];
  3455. nodes[3] = nodes[1];
  3456. }
  3457. } else {
  3458. if (nodes[0] != null && nodes[1] != null && nodes[0].val > nodes[1].val)
  3459. nodes[3] = nodes[1];
  3460. }
  3461. recoverTree(root.right, nodes);
  3462. }
  3463. private static void swap(TreeNode n1, TreeNode n2) {
  3464. if (n1 != null && n2 != null) {
  3465. int temp = n1.val;
  3466. n1.val = n2.val;
  3467. n2.val = temp;
  3468. }
  3469. }
  3470. /**
  3471. * https://oj.leetcode.com/problems/same-tree/
  3472. * http://www.programcreek.com/2012/12/check-if-two-trees-are-same-or-not/
  3473. * https://oj.leetcode.com/submissions/detail/12151092/
  3474. *
  3475. */
  3476. public boolean isSameTree(TreeNode p, TreeNode q) {
  3477. if(p == q)
  3478. return true;
  3479. if(p == null && q == null)
  3480. return true;
  3481. else if (p != null && q != null) {
  3482. if (p.val != q.val)
  3483. return false;
  3484. else
  3485. return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
  3486. } else
  3487. return false;
  3488. }
  3489. /**
  3490. * https://oj.leetcode.com/problems/symmetric-tree/
  3491. * https://oj.leetcode.com/submissions/detail/12151355/
  3492. */
  3493. public boolean isSymmetric(TreeNode root) {
  3494. if(root == null)
  3495. return true;
  3496. return isSymmetric(root.left, root.right);
  3497. }
  3498. private boolean isSymmetric(TreeNode p, TreeNode q) {
  3499. if (p == null && q == null)
  3500. return true;
  3501. else if (p != null && q != null) {
  3502. if (p.val != q.val)
  3503. return false;
  3504. else
  3505. return isSymmetric(p.left, q.right) && isSymmetric(p.right, q.left);
  3506. } else
  3507. return false;
  3508. }
  3509. /**
  3510. * https://oj.leetcode.com/problems/binary-tree-level-order-traversal/
  3511. * https://oj.leetcode.com/submissions/detail/12096507/
  3512. */
  3513. public List<List<Integer>> levelOrder(TreeNode root) {
  3514. List<List<Integer>> result = new ArrayList<List<Integer>>();
  3515. if (root == null)
  3516. return result;
  3517. List<TreeNode> parents = new ArrayList<TreeNode>();
  3518. parents.add(root);
  3519. levelOrder(result, parents);
  3520. return result;
  3521. }
  3522. private void levelOrder(List<List<Integer>> result, List<TreeNode> parents) {
  3523. if (parents.size() == 0)
  3524. return;
  3525. List<Integer> list = new ArrayList<Integer>();
  3526. List<TreeNode> children = new ArrayList<TreeNode>();
  3527. for (TreeNode p : parents) {
  3528. list.add(p.val);
  3529. if (p.left != null)
  3530. children.add(p.left);
  3531. if (p.right != null)
  3532. children.add(p.right);
  3533. }
  3534. result.add(list);
  3535. levelOrder(result, children);
  3536. }
  3537. /**
  3538. * https://oj.leetcode.com/problems/binary-tree-zigzag-level-order-traversal/
  3539. * https://oj.leetcode.com/submissions/detail/12097056/
  3540. */
  3541. public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
  3542. List<List<Integer>> result = new ArrayList<List<Integer>>();
  3543. if (root == null)
  3544. return result;
  3545. List<TreeNode> parents = new ArrayList<TreeNode>();
  3546. parents.add(root);
  3547. zigzagLevelOrder(result, parents, true);
  3548. return result;
  3549. }
  3550. private void zigzagLevelOrder(List<List<Integer>> result, List<TreeNode> parents, boolean leftToRight) {
  3551. if (parents.isEmpty())
  3552. return;
  3553. ArrayList<Integer> list = new ArrayList<Integer>();
  3554. List<TreeNode> children = new ArrayList<TreeNode>();
  3555. for (TreeNode p : parents) {
  3556. list.add(p.val);
  3557. if (p.left != null)
  3558. children.add(p.left);
  3559. if (p.right != null)
  3560. children.add(p.right);
  3561. }
  3562. if (!leftToRight)
  3563. reverseList(list);
  3564. result.add(list);
  3565. zigzagLevelOrder(result, children, !leftToRight);
  3566. }
  3567. private void reverseList(ArrayList<Integer> list) {
  3568. if (list.isEmpty())
  3569. return;
  3570. int i = 0, j = list.size() - 1;
  3571. while (i < j) {
  3572. int temp = list.get(i);
  3573. list.set(i, list.get(j));
  3574. list.set(j, temp);
  3575. i++;
  3576. j--;
  3577. }
  3578. }
  3579. /**
  3580. * https://oj.leetcode.com/problems/maximum-depth-of-binary-tree/
  3581. * https://oj.leetcode.com/submissions/detail/12097436/
  3582. */
  3583. public int maxDepth(TreeNode root) {
  3584. if(root == null)
  3585. return 0;
  3586. return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
  3587. }
  3588. /**
  3589. * https://oj.leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
  3590. * https://oj.leetcode.com/submissions/detail/12099693/
  3591. */
  3592. public static TreeNode buildTree1(int[] preorder, int[] inorder) {
  3593. if (preorder.length == 0 || inorder.length == 0)
  3594. return null;
  3595. if (preorder.length != inorder.length)
  3596. return null;
  3597. int val = preorder[0];
  3598. TreeNode root = new TreeNode(val);
  3599. int index = rootIndex(val, inorder);
  3600. if (index >= 0) {
  3601. int[] leftPreorder = new int[index];
  3602. int[] leftInorder = new int[index];
  3603. for (int i = 0; i <= index - 1; i++) {
  3604. leftPreorder[i] = preorder[i + 1];
  3605. leftInorder[i] = inorder[i];
  3606. }
  3607. int[] rightPreorder = new int[preorder.length - index - 1];
  3608. int[] rightInorder = new int[preorder.length - index - 1];
  3609. for (int i = index + 1; i <= preorder.length - 1; i++) {
  3610. rightPreorder[i - index - 1] = preorder[i];
  3611. rightInorder[i - index - 1] = inorder[i];
  3612. }
  3613. root.left = buildTree1(leftPreorder, leftInorder);
  3614. root.right = buildTree1(rightPreorder, rightInorder);
  3615. }
  3616. return root;
  3617. }
  3618. private static int rootIndex(int val, int[] inorder) {
  3619. int index = 0;
  3620. for (int i = 0; i <= inorder.length - 1; i++) {
  3621. if (inorder[i] == val)
  3622. return i;
  3623. }
  3624. return -1;
  3625. }
  3626. public TreeNode buildTree(int[] preorder, int[] inorder) {
  3627. if (preorder == null || inorder == null)
  3628. return null;
  3629. HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
  3630. for (int i = 0; i < inorder.length; i++) {
  3631. map.put(inorder[i], i);
  3632. }
  3633. return helper(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1, map);
  3634. }
  3635. private TreeNode helper(int[] preorder, int preL, int preR, int[] inorder, int inL, int inR,
  3636. HashMap<Integer, Integer> map) {
  3637. if (preL > preR || inL > inR)
  3638. return null;
  3639. TreeNode root = new TreeNode(preorder[preL]);
  3640. int index = map.get(root.val);
  3641. root.left = helper(preorder, preL + 1, index - inL + preL, inorder, inL, index - 1, map);
  3642. root.right = helper(preorder, preL + index - inL + 1, preR, inorder, index + 1, inR, map);
  3643. return root;
  3644. }
  3645. /**
  3646. * https://oj.leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
  3647. * https://oj.leetcode.com/submissions/detail/12101977/
  3648. */
  3649. // public TreeNode buildTree(int[] inorder, int[] postorder) {
  3650. // if (inorder == null || postorder == null)
  3651. // return null;
  3652. // if (inorder.length == 0 || postorder.length == 0)
  3653. // return null;
  3654. // if (inorder.length != postorder.length)
  3655. // return null;
  3656. //
  3657. // int size = postorder.length;
  3658. // int val = postorder[size - 1];
  3659. // TreeNode root = new TreeNode(val);
  3660. //
  3661. // int index = rootIndex(val, inorder);
  3662. //
  3663. // if (index >= 0) {
  3664. // int[] leftInorder = new int[index];
  3665. // int[] leftPostorder = new int[index];
  3666. //
  3667. // for (int i = 0; i <= index - 1; i++) {
  3668. // leftInorder[i] = inorder[i];
  3669. // leftPostorder[i] = postorder[i];
  3670. // }
  3671. //
  3672. // int[] rightInorder = new int[size - index - 1];
  3673. // int[] rightPostorder = new int[size - index - 1];
  3674. //
  3675. // for (int i = index + 1; i <= size - 1; i++) {
  3676. // rightInorder[i - index - 1] = inorder[i];
  3677. // rightPostorder[i - index - 1] = postorder[i - 1];
  3678. // }
  3679. //
  3680. // root.left = buildTree(leftInorder, leftPostorder);
  3681. // root.right = buildTree(rightInorder, rightPostorder);
  3682. // }
  3683. //
  3684. // return root;
  3685. //
  3686. // }
  3687. /**
  3688. * https://oj.leetcode.com/problems/binary-tree-level-order-traversal-ii/
  3689. * https://oj.leetcode.com/submissions/detail/12102902/
  3690. */
  3691. public List<List<Integer>> levelOrderBottom(TreeNode root) {
  3692. List<List<Integer>> result = new ArrayList<List<Integer>>();
  3693. if (root == null)
  3694. return result;
  3695. Stack<List<Integer>> stack = new Stack<List<Integer>>();
  3696. List<TreeNode> parents = new ArrayList<TreeNode>();
  3697. parents.add(root);
  3698. levelOrderBottom(stack, parents);
  3699. while (!stack.isEmpty()) {
  3700. result.add(stack.pop());
  3701. }
  3702. return result;
  3703. }
  3704. private void levelOrderBottom(Stack<List<Integer>> stack, List<TreeNode> parents) {
  3705. if (parents == null || parents.isEmpty())
  3706. return;
  3707. List<Integer> list = new ArrayList<Integer>();
  3708. List<TreeNode> children = new ArrayList<TreeNode>();
  3709. for (TreeNode p : parents) {
  3710. list.add(p.val);
  3711. if (p.left != null)
  3712. children.add(p.left);
  3713. if (p.right != null)
  3714. children.add(p.right);
  3715. }
  3716. stack.push(list);
  3717. levelOrderBottom(stack, children);
  3718. }
  3719. /**
  3720. * https://oj.leetcode.com/problems/convert-sorted-array-to-binary-search-tree/
  3721. * https://oj.leetcode.com/submissions/detail/12119843/
  3722. */
  3723. public TreeNode sortedArrayToBST(int[] num) {
  3724. if(num == null || num.length == 0)
  3725. return null;
  3726. return sortedArrayToBST(num, 0, num.length - 1);
  3727. }
  3728. private TreeNode sortedArrayToBST(int[] num, int start, int end) {
  3729. if (start > end)
  3730. return null;
  3731. if (start < 0 || start >= num.length)
  3732. return null;
  3733. if (end < 0 || end >= num.length)
  3734. return null;
  3735. if (start == end)
  3736. return new TreeNode(num[start]);
  3737. int mid = start + (end - start) / 2;
  3738. TreeNode root = new TreeNode(num[mid]);
  3739. int leftStart = start;
  3740. int leftEnd = mid - 1;
  3741. int rightStart = mid + 1;
  3742. int rightEnd = end;
  3743. root.left = sortedArrayToBST(num, leftStart, leftEnd);
  3744. root.right = sortedArrayToBST(num, rightStart, rightEnd);
  3745. return root;
  3746. }
  3747. /**
  3748. * https://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/
  3749. * https://oj.leetcode.com/submissions/detail/12120843/
  3750. */
  3751. public TreeNode sortedListToBST(ListNode head) {
  3752. if (head == null)
  3753. return null;
  3754. int length = 0;
  3755. ListNode n = head;
  3756. while (n != null) {
  3757. n = n.next;
  3758. length++;
  3759. }
  3760. return sortedListToBST(head, length);
  3761. }
  3762. private TreeNode sortedListToBST(ListNode head, int length) {
  3763. if (head == null)
  3764. return null;
  3765. if (length <= 0)
  3766. return null;
  3767. if (length == 1)
  3768. return new TreeNode(head.val);
  3769. int mid = length / 2;
  3770. ListNode p = head;
  3771. ListNode q = head.next;
  3772. for (int i = 0; i < mid - 1; i++) {
  3773. p = q;
  3774. q = q.next;
  3775. }
  3776. p.next = null;
  3777. TreeNode root = new TreeNode(q.val);
  3778. root.left = sortedListToBST(head, mid);
  3779. root.right = sortedListToBST(q.next, length - mid - 1);
  3780. return root;
  3781. }
  3782. /**
  3783. * https://oj.leetcode.com/problems/balanced-binary-tree/
  3784. * http://www.programcreek.com/2013/02/leetcode-balanced-binary-tree-java/
  3785. * https://oj.leetcode.com/submissions/detail/12150340/
  3786. */
  3787. public boolean isBalanced(TreeNode root) {
  3788. if (root == null)
  3789. return true;
  3790. int depthLeft = depth(root.left);
  3791. int depthRight = depth(root.right);
  3792. if (Math.abs(depthLeft - depthRight) > 1)
  3793. return false;
  3794. return isBalanced(root.left) && isBalanced(root.right);
  3795. }
  3796. private int depth(TreeNode root) {
  3797. if (root == null)
  3798. return 0;
  3799. return Math.max(1 + depth(root.left), 1 + depth(root.right));
  3800. }
  3801. public boolean isBalanced2(TreeNode root) {
  3802. if (root == null)
  3803. return true;
  3804. if (getHeight(root) == -1)
  3805. return false;
  3806. return true;
  3807. }
  3808. public int getHeight(TreeNode root) {
  3809. if (root == null)
  3810. return 0;
  3811. int left = getHeight(root.left);
  3812. int right = getHeight(root.right);
  3813. if (left == -1 || right == -1)
  3814. return -1;
  3815. if (Math.abs(left - right) > 1) {
  3816. return -1;
  3817. }
  3818. return Math.max(left, right) + 1;
  3819. }
  3820. /**
  3821. * https://oj.leetcode.com/problems/minimum-depth-of-binary-tree/
  3822. * http://www.programcreek.com/2013/02/leetcode-minimum-depth-of-binary-tree-java/
  3823. * https://oj.leetcode.com/submissions/detail/12150692/
  3824. */
  3825. public int minDepth(TreeNode root) {
  3826. if (root == null)
  3827. return 0;
  3828. if (root.left == null && root.right == null)
  3829. return 1;
  3830. else if (root.left != null && root.right == null)
  3831. return 1 + minDepth(root.left);
  3832. else if (root.left == null && root.right != null)
  3833. return 1 + minDepth(root.right);
  3834. else
  3835. return Math.min(1 + minDepth(root.left), 1 + minDepth(root.right));
  3836. }
  3837. public int minDepth2(TreeNode root) {
  3838. if (root == null) {
  3839. return 0;
  3840. }
  3841. LinkedList<TreeNode> nodes = new LinkedList<TreeNode>();
  3842. LinkedList<Integer> counts = new LinkedList<Integer>();
  3843. nodes.add(root);
  3844. counts.add(1);
  3845. while (!nodes.isEmpty()) {
  3846. TreeNode curr = nodes.remove();
  3847. int count = counts.remove();
  3848. if (curr.left != null) {
  3849. nodes.add(curr.left);
  3850. counts.add(count + 1);
  3851. }
  3852. if (curr.right != null) {
  3853. nodes.add(curr.right);
  3854. counts.add(count + 1);
  3855. }
  3856. if (curr.left == null && curr.right == null) {
  3857. return count;
  3858. }
  3859. }
  3860. return 0;
  3861. }
  3862. /**
  3863. * https://oj.leetcode.com/problems/path-sum/
  3864. * https://oj.leetcode.com/submissions/detail/12152755/
  3865. */
  3866. public boolean hasPathSum(TreeNode root, int sum) {
  3867. if (root == null)
  3868. return false;
  3869. if (root.val == sum && root.left == null && root.right == null)
  3870. return true;
  3871. else
  3872. return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
  3873. }
  3874. /**
  3875. * https://oj.leetcode.com/problems/path-sum-ii/
  3876. * https://oj.leetcode.com/submissions/detail/12153401/
  3877. */
  3878. public List<List<Integer>> pathSum(TreeNode root, int sum) {
  3879. List<List<Integer>> result = new ArrayList<List<Integer>>();
  3880. List<Integer> list = new ArrayList<Integer>();
  3881. pathSum(result, list, root, sum);
  3882. return result;
  3883. }
  3884. private void pathSum(List<List<Integer>> result, List<Integer> list, TreeNode root, int sum) {
  3885. if (root == null)
  3886. return;
  3887. list.add(root.val);
  3888. if (root.val == sum && root.left == null && root.right == null) {
  3889. result.add(list);
  3890. return;
  3891. }
  3892. if (root.left != null) {
  3893. List<Integer> l1 = new ArrayList<Integer>(list);
  3894. pathSum(result, l1, root.left, sum - root.val);
  3895. }
  3896. if (root.right != null) {
  3897. List<Integer> l2 = new ArrayList<Integer>(list);
  3898. pathSum(result, l2, root.right, sum - root.val);
  3899. }
  3900. }
  3901. /**
  3902. * https://oj.leetcode.com/problems/flatten-binary-tree-to-linked-list/
  3903. * https://oj.leetcode.com/submissions/detail/12210357/
  3904. */
  3905. public void flatten(TreeNode root) {
  3906. if (root == null)
  3907. return;
  3908. flatten(root.right);
  3909. if (root.left != null) {
  3910. TreeNode p = root;
  3911. TreeNode q = root.right;
  3912. flatten(root.left);
  3913. root.right = root.left;
  3914. root.left = null;
  3915. while (p.right != null)
  3916. p = p.right;
  3917. p.right = q;
  3918. }
  3919. }
  3920. /**
  3921. * https://oj.leetcode.com/problems/distinct-subsequences/
  3922. * http://www.programcreek.com/2013/01/leetcode-distinct-subsequences-total-java/
  3923. * https://oj.leetcode.com/submissions/detail/12214198/
  3924. */
  3925. /**
  3926. *
  3927. * Let W(i, j) stand for the number of subsequences of S(0, i) in T(0, j).
  3928. * If S.charAt(i) == T.charAt(j), W(i, j) = W(i-1, j-1) + W(i-1,j); Otherwise, W(i, j) = W(i-1,j).
  3929. */
  3930. public static int numDistinct(String S, String T) {
  3931. int[][] table = new int[S.length()][T.length()];
  3932. for (int i = 0; i < S.length(); i++) {
  3933. if (S.charAt(i) == T.charAt(0)) {
  3934. if (i == 0)
  3935. table[i][0] = 1;
  3936. else
  3937. table[i][0] = table[i - 1][0] + 1;
  3938. } else {
  3939. if (i == 0)
  3940. table[i][0] = 0;
  3941. else
  3942. table[i][0] = table[i - 1][0];
  3943. }
  3944. }
  3945. for (int i = 1; i <= S.length() - 1; i++) {
  3946. for (int j = 1; j <= T.length() - 1; j++) {
  3947. if (S.charAt(i) == T.charAt(j)) {
  3948. table[i][j] += table[i - 1][j] + table[i - 1][j - 1];
  3949. } else {
  3950. table[i][j] += table[i - 1][j];
  3951. }
  3952. }
  3953. }
  3954. return table[S.length() - 1][T.length() - 1];
  3955. }
  3956. public static int numDistinct2(String S, String T) {
  3957. int[][] table = new int[S.length() + 1][T.length() + 1];
  3958. for (int i = 0; i < S.length(); i++)
  3959. table[i][0] = 1;
  3960. for (int i = 1; i <= S.length(); i++) {
  3961. for (int j = 1; j <= T.length(); j++) {
  3962. if (S.charAt(i - 1) == T.charAt(j - 1)) {
  3963. table[i][j] += table[i - 1][j] + table[i - 1][j - 1];
  3964. } else {
  3965. table[i][j] += table[i - 1][j];
  3966. }
  3967. }
  3968. }
  3969. return table[S.length()][T.length()];
  3970. }
  3971. // public static int numDistinct(String S, String T) {
  3972. // Map<String, Integer> countMap = new HashMap<String, Integer>();
  3973. // if (S == null || T == null || S.length() < T.length())
  3974. // return 0;
  3975. //
  3976. // return numDistinct(S, T, S.length(), T.length(), 0, 0, countMap);
  3977. // }
  3978. //
  3979. // public static int numDistinct(String S, String T, int sLen, int tLen, int s, int t, Map<String, Integer> countMap) {
  3980. // if (s >= sLen || t >= tLen)
  3981. // return 0;
  3982. //
  3983. // String key = s + "_" + t;
  3984. //
  3985. // Integer count = countMap.get(key);
  3986. // if (count != null) {
  3987. // return count;
  3988. // } else {
  3989. // char c = T.charAt(t);
  3990. // count = 0;
  3991. // if (t == tLen - 1) {
  3992. // for (int i = s; i <= sLen - 1; i++) {
  3993. // if (S.charAt(i) == c)
  3994. // count++;
  3995. // }
  3996. //
  3997. // } else {
  3998. // for (int i = s; i <= sLen - 1; i++) {
  3999. // if (S.charAt(i) == c) {
  4000. // count += numDistinct(S, T, sLen, tLen, i + 1, t + 1, countMap);
  4001. // }
  4002. //
  4003. // }
  4004. // }
  4005. // countMap.put(key, count);
  4006. // return count;
  4007. // }
  4008. //
  4009. // }
  4010. /**
  4011. * https://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node/
  4012. * https://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/
  4013. * https://oj.leetcode.com/submissions/detail/12269971/
  4014. * https://oj.leetcode.com/submissions/detail/12270020/
  4015. */
  4016. // public void connect(TreeLinkNode root) {
  4017. //
  4018. // if (root == null)
  4019. // return;
  4020. //
  4021. // Queue<TreeLinkNode> parents = new LinkedList<TreeLinkNode>();
  4022. // Queue<TreeLinkNode> children = new LinkedList<TreeLinkNode>();
  4023. //
  4024. // parents.add(root);
  4025. // while (!parents.isEmpty()) {
  4026. // TreeLinkNode p = parents.poll();
  4027. // if (p.left != null) {
  4028. // children.add(p.left);
  4029. // }
  4030. // if (p.right != null) {
  4031. // children.add(p.right);
  4032. // }
  4033. // while (!parents.isEmpty()) {
  4034. // TreeLinkNode q = parents.poll();
  4035. // p.next = q;
  4036. // p = q;
  4037. // if (p.left != null) {
  4038. // children.add(p.left);
  4039. // }
  4040. // if (p.right != null) {
  4041. // children.add(p.right);
  4042. // }
  4043. // }
  4044. //
  4045. // while (!children.isEmpty()) {
  4046. // parents.add(children.poll());
  4047. // }
  4048. //
  4049. // }
  4050. //
  4051. // }
  4052. /**
  4053. * https://oj.leetcode.com/problems/pascals-triangle/
  4054. * https://oj.leetcode.com/submissions/detail/12270979/
  4055. */
  4056. // public List<List<Integer>> generate(int numRows) {
  4057. // List<List<Integer>> result = new ArrayList<List<Integer>>();
  4058. // List<Integer> list = new ArrayList<Integer>();
  4059. // List<Integer> last = new ArrayList<Integer>();
  4060. //
  4061. // if(numRows == 0)
  4062. // return result;
  4063. //
  4064. // list.add(1);
  4065. // result.add(list);
  4066. //
  4067. // if (numRows == 1)
  4068. // return result;
  4069. //
  4070. // for (int i = 2; i <= numRows; i++) {
  4071. // last = list;
  4072. // list = new ArrayList<Integer>();
  4073. // list.add(1);
  4074. // for (int j = 0; j <= last.size() - 2; j++) {
  4075. // list.add(last.get(j) + last.get(j + 1));
  4076. // }
  4077. // list.add(1);
  4078. // result.add(list);
  4079. // }
  4080. // return result;
  4081. //
  4082. // }
  4083. /**
  4084. * https://oj.leetcode.com/problems/pascals-triangle-ii/
  4085. * https://oj.leetcode.com/submissions/detail/12271303/
  4086. */
  4087. public List<Integer> getRow(int rowIndex) {
  4088. List<Integer> result = new ArrayList<Integer>();
  4089. if (rowIndex < 0)
  4090. return result;
  4091. result.add(1);
  4092. if (rowIndex == 0)
  4093. return result;
  4094. List<Integer> last = new ArrayList<Integer>();
  4095. for (int i = 1; i <= rowIndex; i++) {
  4096. last = result;
  4097. result = new ArrayList<Integer>();
  4098. result.add(1);
  4099. for (int j = 0; j <= last.size() - 2; j++) {
  4100. result.add(last.get(j) + last.get(j + 1));
  4101. }
  4102. result.add(1);
  4103. }
  4104. return result;
  4105. }
  4106. /**
  4107. * https://oj.leetcode.com/problems/triangle/
  4108. * https://oj.leetcode.com/submissions/detail/12272520/
  4109. */
  4110. public int minimumTotal(List<List<Integer>> triangle) {
  4111. if (triangle == null || triangle.size() == 0)
  4112. return 0;
  4113. int numRows = triangle.size();
  4114. if (numRows == 1)
  4115. return triangle.get(0).get(0);
  4116. int[] row = new int[numRows];
  4117. List<Integer> lastRow = triangle.get(numRows - 1);
  4118. for (int i = 0; i <= numRows - 1; i++)
  4119. row[i] = lastRow.get(i);
  4120. for (int i = numRows - 2; i >= 0; i--) {
  4121. lastRow = triangle.get(i);
  4122. for (int j = 0; j <= i; j++)
  4123. row[j] = lastRow.get(j) + Math.min(row[j], row[j + 1]);
  4124. }
  4125. return row[0];
  4126. }
  4127. /////////////////////////////////////////////
  4128. /////////////////////////////////////////////
  4129. /**
  4130. *
  4131. * http://www.programcreek.com/2013/02/leetcode-longest-substring-without-repeating-characters-java/
  4132. * @param s
  4133. * @return
  4134. */
  4135. public static Set<String> longestSubstring(String s) {
  4136. Set<String> set = new HashSet<String>();
  4137. if(s.isEmpty())
  4138. return set;
  4139. if(s.length() == 1){
  4140. set.add(s);
  4141. return set;
  4142. }
  4143. int longest = 0;
  4144. HashMap<Character, Integer> map = new HashMap<Character, Integer>();
  4145. int begin = 0;
  4146. for (int i = 0; i < s.length(); i++) {
  4147. if (!map.containsKey(s.charAt(i))) {
  4148. map.put(s.charAt(i), i);
  4149. } else {
  4150. if (map.size() == longest) {
  4151. set.add(s.substring(begin, i));
  4152. } else if (map.size() > longest) {
  4153. set.clear();
  4154. set.add(s.substring(begin, i));
  4155. longest = map.size();
  4156. }
  4157. i = map.get(s.charAt(i));
  4158. begin = i + 1;
  4159. map.clear();
  4160. }
  4161. }
  4162. if (map.size() == longest)
  4163. set.add(s.substring(begin));
  4164. else if (map.size() > longest) {
  4165. set.clear();
  4166. set.add(s.substring(begin));
  4167. }
  4168. return set;
  4169. }
  4170. public static int lengthOfLongestSubstring1(String s) {
  4171. if(s == null || s.length() == 0)
  4172. return 0;
  4173. int longest = 1;
  4174. char[] c = s.toCharArray();
  4175. int i = 0, j = 1;
  4176. for(j = 1; j < c.length; j++){
  4177. int index = s.substring(i, j).indexOf(c[j]);
  4178. if(index >= 0){
  4179. if(j - i > longest)
  4180. longest = j - i;
  4181. i += index + 1;
  4182. }
  4183. }
  4184. return Math.max(j - i, longest);
  4185. }
  4186. public static double findMedianOfTwoSortedArray(int[] a, int[] b){
  4187. int aLen = a.length;
  4188. int bLen = b.length;
  4189. if((aLen + bLen) % 2 == 0){
  4190. return (kthElement(a, b, (aLen + bLen)/2 -1, 0, aLen - 1, 0, bLen - 1) + kthElement(a, b, (aLen + bLen)/2, 0, aLen -1, 0, bLen - 1)) * 0.5;
  4191. } else{
  4192. return kthElement(a, b, (aLen + bLen)/2, 0, aLen - 1, 0, bLen -1);
  4193. }
  4194. }
  4195. /**
  4196. *
  4197. * http://www.programcreek.com/2012/12/leetcode-regular-expression-matching-in-java/
  4198. */
  4199. //Get the starting string with the same characters of the s.charAt(0)
  4200. public static boolean isMatch1(String s, String p) {
  4201. if (p.length() == 0)
  4202. return s.length() == 0;
  4203. if (p.length() == 1 || p.charAt(1) != '*') {
  4204. if (s.length() < 1 || (p.charAt(0) != '.' && p.charAt(0) != s.charAt(0)))
  4205. return false;
  4206. return isMatch1(s.substring(1), p.substring(1));
  4207. } else {
  4208. int i = -1;
  4209. while (i < s.length() && (i < 0 || p.charAt(0) == '.' || p.charAt(0) == s.charAt(i))) {
  4210. if (isMatch1(s.substring(i + 1), p.substring(2)))
  4211. return true;
  4212. i++;
  4213. }
  4214. return false;
  4215. }
  4216. }
  4217. /**
  4218. *
  4219. * http://www.programcreek.com/2012/12/leetcode-3sum/
  4220. */
  4221. private class Result {
  4222. int a;
  4223. int b;
  4224. int c;
  4225. Result(int a, int b, int c) {
  4226. this.a = a;
  4227. this.b = b;
  4228. this.c = c;
  4229. }
  4230. public boolean equals(Result r) {
  4231. return a == r.a && b == r.b && c == r.c;
  4232. }
  4233. public String toString() {
  4234. return "(" + a + "," + b + "," + c + ")";
  4235. }
  4236. }
  4237. public Set<Result> threeSum1(int[] a) {
  4238. Set<Result> results = new HashSet<Result>();
  4239. Arrays.sort(a);
  4240. for (int i = 0; i <= a.length - 2; i++) {
  4241. int k = i + 1;
  4242. int l = a.length - 1;
  4243. while (k < l) {
  4244. int sum = a[i] + a[k] + a[l];
  4245. if (sum == 0) {
  4246. results.add(new Result(a[i], a[k], a[l]));
  4247. k++;
  4248. l--;
  4249. } else if (sum < 0) {
  4250. k++;
  4251. } else {
  4252. l--;
  4253. }
  4254. }
  4255. }
  4256. return results;
  4257. }
  4258. /**
  4259. * http://www.programcreek.com/2013/02/leetcode-3sum-closest-java/
  4260. */
  4261. public int threeSumCloest(int[] a, int target) {
  4262. Arrays.sort(a);
  4263. int min = Integer.MAX_VALUE;
  4264. int result = 0;
  4265. for (int i = 0; i <= a.length - 3; i++) {
  4266. int j = i + 1;
  4267. int k = a.length - 1;
  4268. while (j < k) {
  4269. int sum = a[i] + a[j] + a[k];
  4270. int diff = Math.abs(sum - target);
  4271. if (diff < min) {
  4272. result = sum;
  4273. }
  4274. if (sum == target) {
  4275. return sum;
  4276. } else if (sum < target) {
  4277. j++;
  4278. } else {
  4279. k--;
  4280. }
  4281. }
  4282. }
  4283. return result;
  4284. }
  4285. /**
  4286. *
  4287. * leetcode-merge-two-sorted-lists-java/
  4288. */
  4289. public static LinkedListNode<Integer> mergetList(LinkedListNode<Integer> l1, LinkedListNode<Integer> l2) {
  4290. LinkedListNode<Integer> list = new LinkedListNode<Integer>(0);
  4291. LinkedListNode<Integer> p = list;
  4292. while (l1 != null && l2 != null) {
  4293. if (l1.e <= l2.e) {
  4294. p.next = l1;
  4295. l1 = l1.next;
  4296. } else {
  4297. p.next = l2;
  4298. l2 = l2.next;
  4299. }
  4300. p = p.next;
  4301. p.next = null;
  4302. }
  4303. if (l1 == null)
  4304. p.next = l2;
  4305. if (l2 == null)
  4306. p.next = l1;
  4307. return list.next;
  4308. }
  4309. /**
  4310. *
  4311. * http://www.programcreek.com/2014/01/leetcode-generate-parentheses-java/
  4312. */
  4313. public static Set<String> generateParentheses(int n) {
  4314. Set<String> set = new HashSet<String>();
  4315. if (n == 0)
  4316. return set;
  4317. if (n == 1) {
  4318. set.add("()");
  4319. return set;
  4320. }
  4321. set = generateParentheses(n - 1);
  4322. Set<String> set1 = set;
  4323. set = new HashSet<String>();
  4324. for (String s : set1) {
  4325. for (int i = 0; i < 2 * (n - 1); i++) {
  4326. StringBuilder sb = new StringBuilder();
  4327. sb.append(s.substring(0, i)).append("(").append(s.substring(i));
  4328. String s1 = sb.toString();
  4329. for (int j = i + 1; j < 2 * n - 1; j++) {
  4330. sb = new StringBuilder();
  4331. sb.append(s1.substring(0, j)).append(")").append(s1.substring(j));
  4332. set.add(sb.toString());
  4333. }
  4334. }
  4335. }
  4336. return set;
  4337. }
  4338. public static ArrayList<String> generateParenthesis1(int n) {
  4339. ArrayList<String> res = new ArrayList<String>();
  4340. if(n==0) {
  4341. res.add("");
  4342. return res;
  4343. }
  4344. helper(n,0,0,res,"");
  4345. return res;
  4346. }
  4347. public static void helper(int n, int left, int right, ArrayList<String> res, String temp){
  4348. // exit: all ( appeared
  4349. if(left == n){
  4350. for (int i=0; i<n-right; i++)
  4351. temp = temp + ")";
  4352. res.add(temp);
  4353. return;
  4354. }
  4355. // case1: number of ( > number of )
  4356. if(left>right){
  4357. helper(n, left+1, right, res, temp + "(");
  4358. helper(n, left, right+1, res, temp + ")");
  4359. }
  4360. // case2: number of ( == number of )
  4361. else helper(n, left+1, right, res, temp + "(");
  4362. }
  4363. /**
  4364. *
  4365. * https://oj.leetcode.com/problems/remove-nth-node-from-end-of-list/
  4366. */
  4367. public ListNode removeNthFromEnd1(ListNode head, int n) {
  4368. if (n <= 0) return head;
  4369. ListNode p = head;
  4370. ListNode q = head;
  4371. for (int i = 0; i < n; i++) {
  4372. if (q != null)
  4373. q = q.next;
  4374. }
  4375. if (q == null) {
  4376. head = p.next;
  4377. } else {
  4378. while (q.next != null) {
  4379. p = p.next;
  4380. q = q.next;
  4381. }
  4382. p.next = p.next.next;
  4383. }
  4384. return head;
  4385. }
  4386. /**
  4387. * https://oj.leetcode.com/problems/swap-nodes-in-pairs/
  4388. * Definition for singly-linked list.
  4389. * public class ListNode {
  4390. * int val;
  4391. * ListNode next;
  4392. * ListNode(int x) {
  4393. * val = x;
  4394. * next = null;
  4395. * }
  4396. * }
  4397. * ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890
  4398. * abcdefghijklmnopqrstuvwxyz 1234567890
  4399. */
  4400. public ListNode swapParis(ListNode head) {
  4401. ListNode p = head;
  4402. while (p != null) {
  4403. ListNode q = p.next;
  4404. if (q == null) {
  4405. return head;
  4406. } else {
  4407. int temp = p.val;
  4408. p.val = q.val;
  4409. q.val = temp;
  4410. p = q.next;
  4411. }
  4412. }
  4413. return head;
  4414. }
  4415. /**
  4416. *
  4417. * https://oj.leetcode.com/problems/reverse-nodes-in-k-group/
  4418. */
  4419. public ListNode reverseKGroup2(ListNode head, int k) {
  4420. if (k <= 1)
  4421. return head;
  4422. ListNode rev = null; //reversed list
  4423. ListNode tail = null; //tail of the reversed list
  4424. ListNode list = head;
  4425. while (head != null) {
  4426. ListNode p = head;
  4427. ListNode q = head;
  4428. ListNode t = head; //tail of the reversed sub list
  4429. ListNode r = null;
  4430. //Check if the number of nodes is a multiple of k
  4431. for (int i = 0; i < k - 1; i++) {
  4432. if (head != null)
  4433. head = head.next;
  4434. }
  4435. if (head != null) {
  4436. head = head.next;
  4437. //Revere the sub list
  4438. for (int i = 0; i < k; i++) {
  4439. p = p.next;
  4440. q.next = r;
  4441. r = q;
  4442. q = p;
  4443. }
  4444. if (rev == null)
  4445. rev = r;
  4446. else
  4447. tail.next = r;
  4448. t.next = null;
  4449. tail = t;
  4450. } else {
  4451. if (tail != null)
  4452. tail.next = p;
  4453. }
  4454. }
  4455. return rev == null ? list : rev;
  4456. }
  4457. public ListNode reverseKGroup1(ListNode head, int k) {
  4458. if (k <= 1)
  4459. return head;
  4460. int count = 0;
  4461. ListNode p = head;
  4462. while(count < k && p != null){
  4463. count++;
  4464. p = p.next;
  4465. }
  4466. if(count < k)
  4467. return head;
  4468. p = head;
  4469. ListNode q = head;
  4470. ListNode r = null;
  4471. for(int i = 0; i < k; i++){
  4472. p = p.next;
  4473. q.next = r;
  4474. r = q;
  4475. q = p;
  4476. }
  4477. head.next = reverseKGroup1(p, k);
  4478. return r;
  4479. }
  4480. public static void main(String[] args){
  4481. System.out.println("Test twoSum");
  4482. int[] numbers = {1, 3, 5, 5, 7, 8, 9, 8, 4, 5, 3, 2, 1, 11};
  4483. int[] e = twoSum(numbers, 20);
  4484. System.out.println(StringUtils.arrayToString(e, 0, e.length - 1));
  4485. numbers = new int[]{2, 7, 11, 15};
  4486. e = twoSum(numbers, 9);
  4487. System.out.println(StringUtils.arrayToString(e, 0, e.length - 1));
  4488. System.out.println("Test reverseInt");
  4489. System.out.println("Reverse 0 - " + reverse(0));
  4490. System.out.println("Reverse 1 - " + reverse(1));
  4491. System.out.println("Reverse 123456 - " + reverse(123456));
  4492. System.out.println("Reverse -123456 - " + reverse(-123456));
  4493. System.out.println("Test atoi");
  4494. System.out.println("atoi()=" + atoi(""));
  4495. System.out.println("atoi( )=" + atoi(" "));
  4496. System.out.println("atoi(12345)=" + atoi("12345"));
  4497. System.out.println("atoi(+12345)=" + atoi("+12345"));
  4498. System.out.println("atoi(-12345)=" + atoi("-12345"));
  4499. long t1 = System.currentTimeMillis();
  4500. System.out.println(lengthOfLongestSubstring1("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCD"));
  4501. long t2 = System.currentTimeMillis();
  4502. System.out.println("t2 - t1=" + (t2 - t1));
  4503. System.out.println(lengthOfLongestSubstring("a"));
  4504. StringUtils.printSet(longestSubstring("a"));
  4505. System.out.println(lengthOfLongestSubstring("aa"));
  4506. StringUtils.printSet(longestSubstring("aa"));
  4507. System.out.println(lengthOfLongestSubstring("ab"));
  4508. StringUtils.printSet(longestSubstring("ab"));
  4509. System.out.println(lengthOfLongestSubstring("abc"));
  4510. StringUtils.printSet(longestSubstring("abc"));
  4511. System.out.println(lengthOfLongestSubstring("aba"));
  4512. StringUtils.printSet(longestSubstring("aba"));
  4513. System.out.println(lengthOfLongestSubstring("abca"));
  4514. StringUtils.printSet(longestSubstring("abca"));
  4515. System.out.println(lengthOfLongestSubstring("abab"));
  4516. StringUtils.printSet(longestSubstring("abab"));
  4517. System.out.println(lengthOfLongestSubstring("abcdae"));
  4518. StringUtils.printSet(longestSubstring("abcdae"));
  4519. System.out.println("Test expend");
  4520. String s = "a";
  4521. System.out.println(expend(s, 0, 0));
  4522. s = "a";
  4523. System.out.println(expend(s, 0, 1));
  4524. s = "ab";
  4525. System.out.println(expend(s, 0, 1));
  4526. s = "aa";
  4527. System.out.println(expend(s, 0, 1));
  4528. s = "aba";
  4529. System.out.println(expend(s, 1, 1));
  4530. s = "abcbd";
  4531. System.out.println(expend(s, 2, 1));
  4532. s = "abccbdadb";
  4533. System.out.println(expend(s, 2, 3));
  4534. System.out.println("Test longestPalindroms");
  4535. Set<String> results = longestPalindromSubStrings1(s);
  4536. StringUtils.printSet(results);
  4537. s = "abccbddbb";
  4538. System.out.println(expend(s, 2, 3));
  4539. System.out.println("Test longestPalindroms");
  4540. results = longestPalindromSubStrings1(s);
  4541. StringUtils.printSet(results);
  4542. int[] a = {};
  4543. int[] b = {1, 2, 3, 4, 5};
  4544. System.out.println(kthElement(a, b, 0, 0, 1, 0, b.length - 1));
  4545. System.out.println(kthElement(a, b, 1, 0, a.length - 1, 0, b.length - 1));
  4546. System.out.println(kthElement(a, b, 2, 0, a.length - 1, 0, b.length - 1));
  4547. System.out.println(kthElement(a, b, 3, 0, a.length - 1, 0, b.length - 1));
  4548. System.out.println(kthElement(a, b, 4, 0, a.length - 1, 0, b.length - 1));
  4549. a = new int[]{1, 2, 4, 7, 9, 10, 13, 17};
  4550. b = new int[] {1, 2, 3, 8, 8, 11, 12};
  4551. System.out.println(kthElement(a, b, 0, 0, a.length - 1, 0, b.length - 1));
  4552. System.out.println(kthElement(a, b, 3, 0, a.length - 1, 0, b.length - 1));
  4553. System.out.println(kthElement(a, b, 0, 0, a.length - 1, 0, b.length - 1));
  4554. System.out.println(kthElement(a, b, 1, 0, a.length - 1, 0, b.length - 1));
  4555. System.out.println(kthElement(a, b, 2, 0, a.length - 1, 0, b.length - 1));
  4556. System.out.println(kthElement(a, b, 3, 0, a.length - 1, 0, b.length - 1));
  4557. System.out.println(kthElement(a, b, 4, 0, a.length - 1, 0, b.length - 1));
  4558. System.out.println(kthElement(a, b, 5, 0, a.length - 1, 0, b.length - 1));
  4559. System.out.println(kthElement(a, b, 6, 0, a.length - 1, 0, b.length - 1));
  4560. System.out.println(kthElement(a, b, 7, 0, a.length - 1, 0, b.length - 1));
  4561. System.out.println(kthElement(a, b, 8, 0, a.length - 1, 0, b.length - 1));
  4562. System.out.println(kthElement(a, b, 9, 0, a.length - 1, 0, b.length - 1));
  4563. System.out.println(kthElement(a, b, 10, 0, a.length - 1, 0, b.length - 1));
  4564. System.out.println(kthElement(a, b, 11, 0, a.length - 1, 0, b.length - 1));
  4565. System.out.println(kthElement(a, b, 12, 0, a.length - 1, 0, b.length - 1));
  4566. System.out.println(kthElement(a, b, 13, 0, a.length - 1, 0, b.length - 1));
  4567. System.out.println(kthElement(a, b, 14, 0, a.length - 1, 0, b.length - 1));
  4568. System.out.println("Test findMedianOfTwoSortedArray");
  4569. System.out.println(findMedianOfTwoSortedArray(a, b));
  4570. a = new int[]{1, 2, 3, 4, 5, 6};
  4571. b = new int[] {7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  4572. System.out.println(kthElement(a, b, 0, 0, a.length - 1, 0, b.length - 1));
  4573. System.out.println(kthElement(a, b, 3, 0, a.length - 1, 0, b.length - 1));
  4574. System.out.println(kthElement(a, b, 0, 0, a.length - 1, 0, b.length - 1));
  4575. System.out.println(kthElement(a, b, 1, 0, a.length - 1, 0, b.length - 1));
  4576. System.out.println(kthElement(a, b, 2, 0, a.length - 1, 0, b.length - 1));
  4577. System.out.println(kthElement(a, b, 3, 0, a.length - 1, 0, b.length - 1));
  4578. System.out.println(kthElement(a, b, 4, 0, a.length - 1, 0, b.length - 1));
  4579. System.out.println(kthElement(a, b, 5, 0, a.length - 1, 0, b.length - 1));
  4580. System.out.println(kthElement(a, b, 6, 0, a.length - 1, 0, b.length - 1));
  4581. System.out.println(kthElement(a, b, 7, 0, a.length - 1, 0, b.length - 1));
  4582. System.out.println(kthElement(a, b, 8, 0, a.length - 1, 0, b.length - 1));
  4583. System.out.println(kthElement(a, b, 9, 0, a.length - 1, 0, b.length - 1));
  4584. System.out.println(kthElement(a, b, 10, 0, a.length - 1, 0, b.length - 1));
  4585. System.out.println(kthElement(a, b, 11, 0, a.length - 1, 0, b.length - 1));
  4586. System.out.println(kthElement(a, b, 12, 0, a.length - 1, 0, b.length - 1));
  4587. System.out.println(kthElement(a, b, 13, 0, a.length - 1, 0, b.length - 1));
  4588. System.out.println(kthElement(a, b, 14, 0, a.length - 1, 0, b.length - 1));
  4589. System.out.println("Test findMedianOfTwoSortedArray");
  4590. System.out.println(findMedianOfTwoSortedArray(a, b));
  4591. System.out.println("Test isParlindrome");
  4592. System.out.println(isPalindrome(0));
  4593. System.out.println(isPalindrome(1));
  4594. System.out.println(isPalindrome(10));
  4595. System.out.println(isPalindrome(11));
  4596. System.out.println(isPalindrome(123));
  4597. System.out.println(isPalindrome(121));
  4598. System.out.println(isPalindrome(123454321));
  4599. s = "";
  4600. System.out.println("Test isMatch");
  4601. System.out.println(isMatch("a", "ab*"));
  4602. System.out.println(isMatch("", "abc"));
  4603. System.out.println(isMatch("a", ""));
  4604. System.out.println(isMatch("a", "aac"));
  4605. System.out.println(isMatch("a", "aba"));
  4606. System.out.println(isMatch("ab", "abc"));
  4607. System.out.println(isMatch("abc", "abc"));
  4608. System.out.println(isMatch("abc", "abd"));
  4609. System.out.println(isMatch("a", "bac"));
  4610. System.out.println(isMatch("abc", "defabc"));
  4611. System.out.println(isMatch("abcdefg", "abcdef"));
  4612. System.out.println(isMatch("abcdefg", "abcdefg"));
  4613. System.out.println(isMatch("abcdefg", "abcdefghijk"));
  4614. System.out.println(isMatch("a", "*"));
  4615. System.out.println(isMatch("a", ".c"));
  4616. System.out.println(isMatch("ab", "a."));
  4617. System.out.println(isMatch("ab", ".bc"));
  4618. System.out.println(isMatch("abc", "ab."));
  4619. System.out.println(isMatch("aac", ".*ceee"));
  4620. System.out.println(isMatch("aaaabcd", "a*b.d"));
  4621. System.out.println(isMatch("abcdefg", "abcdefg"));
  4622. System.out.println(isMatch("abcdefg", "abcdefghijk"));
  4623. System.out.println("Test match expression");
  4624. System.out.println(isMatch("aa", "a"));
  4625. System.out.println(isMatch("aa", "aa"));
  4626. System.out.println(isMatch("aaa", "aa"));
  4627. System.out.println(isMatch("aa", "a*"));
  4628. System.out.println(isMatch("aa", ".*"));
  4629. System.out.println(isMatch("ab", ".*"));
  4630. System.out.println(isMatch("aab", "c*a*b"));
  4631. a = new int[]{1, 3, 5, 6, 9, 13};
  4632. b = new int[] {1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  4633. LinkedListNode<Integer> l1 = new LinkedListNode(1);
  4634. l1.addLast(3);
  4635. l1.addLast(5);
  4636. l1.addLast(6);
  4637. l1.addLast(9);
  4638. l1.addLast(13);
  4639. l1.addLast(20);
  4640. LinkedListNode<Integer> l2 = new LinkedListNode(1);
  4641. l2.addLast(2);
  4642. l2.addLast(3);
  4643. l2.addLast(5);
  4644. l2.addLast(7);
  4645. l2.addLast(8);
  4646. l2.addLast(9);
  4647. l2.addLast(10);
  4648. l2.addLast(11);
  4649. l2.addLast(12);
  4650. l2.addLast(13);
  4651. l2.addLast(14);
  4652. l2.addLast(15);
  4653. System.out.println("Test mergeLit");
  4654. System.out.println(l1.toString());
  4655. System.out.println(l2.toString());
  4656. LinkedListNode<Integer> l3 = mergetList(l1, l2);
  4657. System.out.println(l3.toString());
  4658. System.out.println("Test generateParentheses");
  4659. Set<String> set = generateParentheses(1);
  4660. StringUtils.printSet(set);
  4661. set = generateParentheses(2);
  4662. StringUtils.printSet(set);
  4663. set = generateParentheses(3);
  4664. StringUtils.printSet(set);
  4665. List<String> parenthesis = generateParenthesis(3);
  4666. for(String p : parenthesis){
  4667. System.out.print(p + "|");
  4668. }
  4669. System.out.println("Test longestCommonPrefix");
  4670. String[] strs = {"abca", "abc"};
  4671. System.out.println(longestCommonPrefix(strs));
  4672. strs = new String[] {"a", "a", "a"};
  4673. System.out.println(longestCommonPrefix(strs));
  4674. strs = new String[] {"aa", "ab"};
  4675. System.out.println(longestCommonPrefix(strs));
  4676. strs = new String[] {"a", "b", "a"};
  4677. System.out.println(longestCommonPrefix(strs));
  4678. strs = new String[] {"a", "ab", "ac"};
  4679. System.out.println(longestCommonPrefix(strs));
  4680. strs = new String[] {"abcde", "abcde", "abcde"};
  4681. System.out.println(longestCommonPrefix(strs));
  4682. strs = new String[] {"abcdefg", "abc", "abckilmko"};
  4683. System.out.println(longestCommonPrefix(strs));
  4684. System.out.println("test removeDuplicates");
  4685. int[] A = {1, 2};
  4686. removeDuplicates(A);
  4687. StringUtils.printArray(A);
  4688. System.out.println("Test threeSumClosest");
  4689. int[] num = {1, 1, 1, 0};
  4690. System.out.println("threeCumCloset - " + threeSumClosest(num, -100));
  4691. System.out.println("test strStr");
  4692. String hay = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
  4693. String needle = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab";
  4694. long s1 = System.currentTimeMillis();
  4695. System.out.println(strStr(hay, needle));
  4696. long s2 = System.currentTimeMillis();
  4697. System.out.println("strStr took " + (s2 - s1));
  4698. s1 = System.currentTimeMillis();
  4699. System.out.println(strStr2(hay, needle));
  4700. s2 = System.currentTimeMillis();
  4701. System.out.println("strStr2 took " + (s2 - s1));
  4702. System.out.println("test divid");
  4703. s1 = System.currentTimeMillis();
  4704. System.out.println(divide(-1010369383, -2147483648));
  4705. s2 = System.currentTimeMillis();
  4706. System.out.println("divid took " + (s2 - s1));
  4707. s1 = System.currentTimeMillis();
  4708. System.out.println(divide(-2147483648, -2));
  4709. s2 = System.currentTimeMillis();
  4710. System.out.println("divid took " + (s2 - s1));
  4711. s1 = System.currentTimeMillis();
  4712. System.out.println(divide(1, 1));
  4713. s2 = System.currentTimeMillis();
  4714. System.out.println("divid took " + (s2 - s1));
  4715. s1 = System.currentTimeMillis();
  4716. System.out.println(divide(-1, 1));
  4717. s2 = System.currentTimeMillis();
  4718. System.out.println("divid took " + (s2 - s1));
  4719. s1 = System.currentTimeMillis();
  4720. System.out.println(divide(1, -1));
  4721. s2 = System.currentTimeMillis();
  4722. System.out.println("divid took " + (s2 - s1));
  4723. System.out.println("Test permute");
  4724. String[] L = {};
  4725. Set<String> result = new HashSet<String>();
  4726. permute(result, L, "", 0, 0);
  4727. StringUtils.printSet(result);
  4728. L = new String[]{"foo"};
  4729. result = new HashSet<String>();
  4730. permute(result, L, "", 0, 1);
  4731. StringUtils.printSet(result);
  4732. L = new String[]{"foo", "bar"};
  4733. result = new HashSet<String>();
  4734. permute(result, L, "", 0, 2);
  4735. StringUtils.printSet(result);
  4736. L = new String[]{"foo", "bar", "car"};
  4737. result = new HashSet<String>();
  4738. permute(result, L, "", 0, 3);
  4739. StringUtils.printSet(result);
  4740. String S = "pjzkrkevzztxductzzxmxsvwjkxpvukmfjywwetvfnujhweiybwvvsrfequzkhossmootkmyxgjgfordrpapjuunmqnxxdrqrfgkrsjqbszgiqlcfnrpjlcwdrvbumtotzylshdvccdmsqoadfrpsvnwpizlwszrtyclhgilklydbmfhuywotjmktnwrfvizvnmfvvqfiokkdprznnnjycttprkxpuykhmpchiksyucbmtabiqkisgbhxngmhezrrqvayfsxauampdpxtafniiwfvdufhtwajrbkxtjzqjnfocdhekumttuqwovfjrgulhekcpjszyynadxhnttgmnxkduqmmyhzfnjhducesctufqbumxbamalqudeibljgbspeotkgvddcwgxidaiqcvgwykhbysjzlzfbupkqunuqtraxrlptivshhbihtsigtpipguhbhctcvubnhqipncyxfjebdnjyetnlnvmuxhzsdahkrscewabejifmxombiamxvauuitoltyymsarqcuuoezcbqpdaprxmsrickwpgwpsoplhugbikbkotzrtqkscekkgwjycfnvwfgdzogjzjvpcvixnsqsxacfwndzvrwrycwxrcismdhqapoojegggkocyrdtkzmiekhxoppctytvphjynrhtcvxcobxbcjjivtfjiwmduhzjokkbctweqtigwfhzorjlkpuuliaipbtfldinyetoybvugevwvhhhweejogrghllsouipabfafcxnhukcbtmxzshoyyufjhzadhrelweszbfgwpkzlwxkogyogutscvuhcllphshivnoteztpxsaoaacgxyaztuixhunrowzljqfqrahosheukhahhbiaxqzfmmwcjxountkevsvpbzjnilwpoermxrtlfroqoclexxisrdhvfsindffslyekrzwzqkpeocilatftymodgztjgybtyheqgcpwogdcjlnlesefgvimwbxcbzvaibspdjnrpqtyeilkcspknyylbwndvkffmzuriilxagyerjptbgeqgebiaqnvdubrtxibhvakcyotkfonmseszhczapxdlauexehhaireihxsplgdgmxfvaevrbadbwjbdrkfbbjjkgcztkcbwagtcnrtqryuqixtzhaakjlurnumzyovawrcjiwabuwretmdamfkxrgqgcdgbrdbnugzecbgyxxdqmisaqcyjkqrntxqmdrczxbebemcblftxplafnyoxqimkhcykwamvdsxjezkpgdpvopddptdfbprjustquhlazkjfluxrzopqdstulybnqvyknrchbphcarknnhhovweaqawdyxsqsqahkepluypwrzjegqtdoxfgzdkydeoxvrfhxusrujnmjzqrrlxglcmkiykldbiasnhrjbjekystzilrwkzhontwmehrfsrzfaqrbbxncphbzuuxeteshyrveamjsfiaharkcqxefghgceeixkdgkuboupxnwhnfigpkwnqdvzlydpidcljmflbccarbiegsmweklwngvygbqpescpeichmfidgsjmkvkofvkuehsmkkbocgejoiqcnafvuokelwuqsgkyoekaroptuvekfvmtxtqshcwsztkrzwrpabqrrhnlerxjojemcxel";
  4741. L = new String[]{"dhvf","sind","ffsl"}; //,"yekr","zwzq","kpeo","cila","tfty","modg"};//,"ztjg","ybty","heqg","cpwo","gdcj","lnle","sefg","vimw","bxcb"};
  4742. result = new HashSet<String>();
  4743. permute(result, L, "", 0, L.length);
  4744. StringUtils.printSet(result);
  4745. System.out.println(result.size());
  4746. S = "abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab";
  4747. L = new String[]{"ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba"};
  4748. S = "abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab";
  4749. L = new String[]{"ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba","ab","ba"};
  4750. // S = "barfoothefoobarman";
  4751. // L = new String[]{"foo", "bar"};
  4752. // S = "aaa";
  4753. // L = new String[]{"a","a"};
  4754. s1 = System.currentTimeMillis();
  4755. List<Integer> list = findSubstring(S, L);
  4756. s2 = System.currentTimeMillis();
  4757. System.out.println("findSubstring took " + (s2 - s1));
  4758. StringUtils.printList(list);
  4759. int[] nums = {2, 3, 1};
  4760. nextPermutation(nums);
  4761. StringUtils.printArray(nums);
  4762. System.out.println("Test longestValidParentheses");
  4763. String p = "(()";
  4764. System.out.println(longestValidParentheses(p));
  4765. p = "";
  4766. System.out.println(longestValidParentheses(p));
  4767. p = "()";
  4768. System.out.println(longestValidParentheses(p));
  4769. p = "()()";
  4770. System.out.println(longestValidParentheses(p));
  4771. p = ")()())";
  4772. System.out.println(longestValidParentheses(p));
  4773. p = "()(()";
  4774. System.out.println(longestValidParentheses(p));
  4775. p = ")()(((())))(";
  4776. System.out.println(longestValidParentheses(p));
  4777. searchRange(new int[]{2,2}, 2);
  4778. char[][] board = { ".87654321".toCharArray(),
  4779. "2........".toCharArray(),
  4780. "3........".toCharArray(),
  4781. "4........".toCharArray(),
  4782. "5........".toCharArray(),
  4783. "6........".toCharArray(),
  4784. "7........".toCharArray(),
  4785. "8........".toCharArray(),
  4786. "9........".toCharArray()};
  4787. System.out.println(isValidSudoku(board));
  4788. System.out.println("Test combineSum");
  4789. int[] candidates = new int[]{1, 2};
  4790. int target = 3;
  4791. List<List<Integer>> r = combinationSum(candidates, target);
  4792. System.out.println(r);
  4793. candidates = new int[]{1, 1};
  4794. target = 1;
  4795. r = combinationSum2(candidates, target);
  4796. System.out.println(r);
  4797. System.out.println("test multiply");
  4798. //System.out.println(add("0", "0"));
  4799. System.out.println(multiply("0", "0"));
  4800. //
  4801. System.out.println("test isMatch2");
  4802. s1 = System.currentTimeMillis();
  4803. //System.out.println(isMatch2("babbbbaabababaabbababaababaabbaabababbaaababbababaaaaaabbabaaaabababbabbababbbaaaababbbabbbbbbbbbbaabbb", "b**bb**a**bba*b**a*bbb**aba***babbb*aa****aabb*bbb***a"));
  4804. //System.out.println(isMatch4("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*"));
  4805. System.out.println(isMatch4("abcdefaaahicg", "ab*aaaa"));
  4806. s2 = System.currentTimeMillis();
  4807. System.out.println("s2 - s1 = " + (s2 - s1));
  4808. System.out.println("Test permute");
  4809. int[] num2 = new int[]{0, 1};
  4810. List<List<Integer>> list2 = permute(num2);
  4811. num2 = new int[] {2,2,1,1};
  4812. list2 = permuteUnique2(num2);
  4813. System.out.println("End");
  4814. System.out.println("Test isAnagrams");
  4815. String[] strs1 = {"nozzle","punjabi","waterlogged","imprison","crux","numismatists","sultans","rambles","deprecating","aware","outfield","marlborough","guardrooms","roast","wattage","shortcuts","confidential","reprint","foxtrot","dispossession","floodgate","unfriendliest","semimonthlies","dwellers","walkways","wastrels","dippers","engrossing","undertakings","unforeseen","oscilloscopes","pioneers","geller","neglects","cultivates","mantegna","elicit","couriered","shielded","shrew","heartening","lucks","teammates","jewishness","documentaries","subliming","sultan","redo","recopy","flippancy","rothko","conductor","e","carolingian","outmanoeuvres","gewgaw","saki","sarah","snooping","hakka","highness","mewling","spender","blockhead","detonated","cognac","congaing","prissy","loathes","bluebell","involuntary","aping","sadly","jiving","buffalo","chided","instalment","boon","ashikaga","enigmas","recommenced","snell","parsley","buns","abracadabra","forewomen","persecuted","carsick","janitorial","neonate","expeditiously","porterhouse","bussed","charm","tinseled","pencils","inherits","crew","estimate","blacktop","mythologists","essequibo","dusky","fends","pithily","positively","participants","brew","tows","pentathlon","misdiagnoses","paraphrase","telephoning","engining","anglo","duisburg","shorthorns","physical","enquiries","grudging","floodlit","safflower","asphalts","representing","airbrush","bedevilling","fulminations","peacefuller","hurl","unequalled","wiser","vinson","paglia","doggones","optimist","rulering","katmandu","flutists","sterling","oregonians","boosts","slaver","straightedges","stendhal","defaulters","stylize","chucking","adulterate","partaking","omelettes","monochrome","bitched","foxhound","tapir","vocalizing","manifolding","northerner","ineptly","dunce","matchbook","locutions","docudrama","sinkers","paralegal","sip","maliced","lechers","zippy","tillman","penknives","olympias","designates","mossiest","leanne","lavishing","understate","underwriting","showered","belittle","propounded","gristly","toxicity","trike","baudelaire","sheers","annmarie","poultices","therapeutics","inputs","bailed","minutest","pynchon","jinx","jackets","subsections","harmonizes","caesareans","freshened","haring","disruption","buckle","per","pined","solemnity","recombined","chamber","tangling","pitiful","authoritarians","oort","ingratiate","refreshed","bavarian","generically","rescheduled","typewritten","level","magnetism","socialists","oligocene","resentful","lambast","counteroffer","firefight","phil","attenuates","teary","demarcated","moralities","electrified","pettiness","unpacking","hungary","heavies","tenancies","tirade","solaria","scarcity","prettiest","carrillo","yodel","cantilever","ridiculously","tagalog","schismatics","ossification","hezbollah","downscaling","calking","tapped","girl","alba","lavishness","stepparents","integrator","overact","father","fobbing","pb","require","toes","sweats","prisoners","mbabane","hatch","motleyer","worlds","decentralize","ingrained","shekels","directorship","negotiating","hiawatha","busying","reciprocate","spinsterhood","supervened","scrimmage","decolonized","buildups","sedative","swats","despotic","driblets","redoubting","stoic","xeroxes","satellited","exteriors","deregulates","lawful","flunk","broached","energetics","moodily","popinjays","shoshone","misleads","abduct","nonevent","flees","harry","cleverness","manipulative","shoplifts","tom","junk","poniard","transmute","stricter","trochees","snack","relations","edger","culminate","implication","carjacked","kissers","federate","offsetting","sutures","wakened","axis","boxcars","grinds","scenting","cordoba","lumberyards","incendiary","antiphonal","decipherable","gilliam","redecorates","plum","nitpickers","linefeed","awakes","embittering","spewing","annul","filial","scarlet","connors","sanctum","scotsman","isobar","activity","overthrowing","unseasoned","tarantulae","outtake","diego","mars","stunted","hunted","sublimation","barbadian","barbarisms","epidemic","assesses","imposture","freaks","detroit","bloodiest","avails","prenatal","connecticut","guardsmen","betwixt","windsock","neutralized","psychoanalysis","rubberized","overproduces","narcissism","tallow","cringes","resinous","paintbrushes","duality","paints","deactivated","expertly","speedsters","coward","bass","psychiatrist","curies","betrays","bubble","mellow","showy","retarding","radishes","coy","unreservedly","larks","apportioned","flaccid","relabelling","alphabeted","anointment","helms","gillian","trophying","breakage","underbrush","directest","wingtips","pretence","preshrink","remarries","addle","brouhaha","mobbing","g","dings","gains","stockade","ouch","particulates","listens","habituation","kill","crouped","hyperbolae","hutching","stoney","rightness","davids","questioned","ethiopians","courtliness","delays","navahos","devils","keeling","accelerators","investigator","spindling","illegality","extremer","revlon","purity","bradly","jut","machs","liquidated","informant","smartly","disfigure","parliaments","croup","teletypes","impression","trainee","implications","embed","podiatrists","jewelled","brokenhearted","spaceman","unsteadier","kitchen","twirling","conurbations","pygmies","lourdes","watertight","reassessing","dempsey","matriarch","alas","abscissae","decanter","commentated","sandy","idler","soybean","cutoff","dictate","credibility","indeterminable","release","blank","curitiba","pericardia","probably","indisposition","hesitantly","duff","ratty","derivative","decals","explication","cockier","monoxides","hyperventilate","genially","polluter","divan","may","convalesces","morpheme","pupa","prospered","tagging","nerdier","detached","spearing","hilbert","russeted","amanuensis","periwinkles","jujube","guarantors","premises","descanting","baned","deviance","sidearms","lamentable","barristers","climes","succulence","mauve","oceanographers","migraine","bisexual","peruvians","fatheads","parsimony","pilaf","portly","conniving","insidiously","inventing","constabulary","cling","stunting","accessioned","deadliness","overthrow","expectorant","agamemnon","blindfold","striker","shrugging","jibes","appropriateness","annihilates","hairs","proselytes","goads","rankling","predominated","hart","enemies","culpability","drank","martinets","prospering","dominick","complemented","invention","foolscap","tolerances","lorelei","profits","awarer","ungodlier","victoriously","mistrusts","princes","drudge","moderator","transversed","disco","japed","loomed","incense","ponds","gumbel","disarranges","coaxes","technology","hyde","debentures","confidantes","hankered","savant","styes","croupy","unapproachable","cisterns","unto","duds","conglomerating","clio","negroid","looked","methodism","hilario","balloon","thesauruses","integuments","thermometer","slacks","wigwagging","gaping","incensed","misquotes","chocking","patrols","upcoming","insists","livings","thoth","uselessness","vibrated","potluck","starboard","uniquer","boone","scintillates","darker","massey","arbitrariness","miniaturized","rousseau","chiffon","consortia","coral","finesses","half","biked","unlikeliest","hilarious","acrid","twinkles","galileo","outsmarted","ostentation","cradle","frats","misidentifies","uncleaner","bacardi","smoothest","antwan","warren","jingling","stocks","daumier","paranoid","pantaloons","dishing","receive","underpays","kane","variation","beset","disobliged","dreadlocks","psychics","twofers","lieutenants","pebbling","interposes","shingles","profanes","machining","dysfunctions","wolfram","brut","nebraskan","truculently","copeland","devonian","fuller","silvia","philosophers","cali","adores","disquiet","savvies","minatory","blooms","radiotelephones","paradoxically","competitions","gandhi","weddell","occludes","retracing","kari","dead","lagoons","menfolk","abundant","enacts","conferences","procreation","steadier","cols","rabble","unquestioned","stupefying","whodunit","dizzier","paula","riposte","elixirs","discontented","zimbabweans","assemblage","unsalted","genders","caldwell","pulleys","pureness","kingston","vests","hearken","abuses","scull","hussar","solace","gondwanaland","surfacing","vivienne","subculture","reciprocal","expediencies","projectiles","segregationist","prickle","pooped","telecommutes","axes","scenery","peppery","parenthesizing","checked","trademarked","unreasonable","curtly","dynamically","vulcanize","airtight","blotch","edmund","stoicism","scrambles","whirled","chasing","millstones","helplessly","permalloy","remanding","duplicate","broadsided","readjustment","buggers","quaked","grapples","democrats","landfalls","apprehensively","turmoiling","railing","lothario","modishly","faggoted","deflecting","interment","dodo","recreants","baywatch","frescoes","temblor","brigade","handgun","bradstreet","caspar","godsend","cochleae","queered","unevenness","hairnet","millimeters","flawless","plumbing","disciplinarian","orbiting","foothill","serviettes","peseta","windmills","myrdal","provides","slowdowns","clouting","gainsays","dishpans","mediates","weaker","shoestrings","gerunds","potsdam","chips","disqualifications","focus","quarry","dwarfs","laurels","coverall","reconsidered","exploded","distending","bronzes","apollonian","sweeper","couperin","gourmets","irreconcilable","goldbricking","emotes","demilitarizes","lambkin","grouper","anyways","hugs","quizzed","misstatement","spectrums","frigates","plenipotentiaries","parasites","tacitly","savvying","treks","dissociating","departing","resins","psychiatric","tablespoonfuls","aught","makeup","copping","interwove","selling","fantasize","flamingos","smolders","stript","laverne","extremely","chattering","imminent","vaulting","slackly","pasteurizes","goody","pearls","conceptualization","fins","brogues","muskogee","naziism","stromboli","sunflower","tosca","luridness","booing","zaniness","creel","bootblacks","attendants","swordplay","impinging","premiere","sedimentation","traffickers","carrel","observatories","telltales","cuckolded","ampler","alternately","shovel","tasmania","whooping","methodologies","pickling","overseer","sunnier","sanchez","supervening","viscus","cramped","santayana","utopias","intimated","pianists","computerizing","interpolating","reggie","horseshoe","preeminent","qantas","standish","flagpoles","thievery","admiring","palefaces","overflows","gaea","monique","sheepskin","bestiaries","beethoven","fleming","convalescing","moldier","snobby","jewry","hoodwinking","hope","henri","listlessly","doggoning","anointed","notable","talented","uric","towards","flue","arbitrated","ingredients","academy","clutches","novelle","parallelling","confabbed","synthesized","frontally","underexpose","ulcerates","injuring","stimulant","catalytic","ogle","throatily","ions","chores","spyglasses","metabolic","statesmanlike","tingles","ossifies","forge","coiffing","transepts","autopsy","colorfast","winery","procyon","sequesters","amended","putted","huff","fliers","harpooning","protecting","shipboard","dwindled","collations","stonewalls","criticism","thigh","quarried","knelling","knitted","redeemable","berm","seventy","misguides","schlemiel","pawn","ineligibility","lathe","bosses","temperance","haywire","everglade","confections","gruelings","mindful","paracelsus","quarreled","furtively","airdropped","clodhopper","transmuting","whilst","moldavia","exploiting","chicories","unrolling","shorthand","antigens","satirically","earner","primmer","jolly","perch","nonplussing","circulars","hanks","fingerprinted","syllogism","adulate","nominally","telecasted","quelled","accustoming","backslide","culminates","spiraled","compactor","gatorade","cornballs","investor","cupboards","deign","induced","ewe","snoopers","supposed","glitters","overlie","ambassadorial","chancel","accumulations","strictest","thalami","shops","moos","applicators","corncob","dona","apostrophes","kibitzes","rinses","kemerovo","confide","clemenceau","centenarians","memorialized","windburn","nominate","obscene","equivocations","arts","karloff","projected","scorned","limping","lava","sanitaria","clementine","brandies","unionize","compacted","griming","trilogies","babysit","congas","glittery","pimientos","phototypesetter","multivitamin","carbohydrates","lode","photographs","iniquity","micrometer","freemasonry","burros","marchers","percentiles","werewolf","weightlifting","valedictories","gacrux","senselessly","stoppage","monolithic","handy","overspent","nymphomaniac","seasick","misogynistic","coltrane","coeval","inversion","darkliest","landfills","barbers","suppurate","cavern","submerge","illumination","hesitates","lashes","covenants","thomism","aneurism","disappointed","gnarls","sprint","abash","frightens","undoings","pa","helicopters","reexamines","vassal","blessing","devaluation","purports","urinals","adjudged","garaging","pacific","infomercials","whitewashed","fawned","baptisms","concede","cornflakes","fostered","clewed","tiller","dalmatians","signification","boneless","chunkiness","omar","paramedicals","professor","unionizing","scripted","anchors","tabloid","alton","redrafted","reflexive","luddite","lamb","bidirectional","seaports","christendom","gets","chaperoning","tchaikovsky","wasters","dioxin","nuke","apologized","queasily","fujiwara","prearranges","abdul","upraising","sparklers","signposting","comparison","sb","cherokees","ungentlemanly","typing","waisted","sputter","biographers","waltz","stanches","upbringings","smithereens","tutor","young","eloy","sourdoughs","clingier","hoisting","blazon","homosexuality","lorries","kippering","abacus","specks","congressional","auditing","lash","eternal","carve","facade","defrauds","neighbored","musses","dismount","lope","lawbreaker","deed","japes","repeal","factorization","impetuosity","sitters","disorganizing","fussing","vale","epitomized","executrixes","deprivations","woodcarvings","miscalls","skateboard","pedicured","cloakroom","vassaled","innumerable","knelt","cellulose","beams","uniform","metatarsals","meteorologist","column","burnishes","dentists","quids","toasts","tableland","archivist","gladiolas","replica","lording","viewed","polisher","trooping","indistinctly","resisters","flycatchers","toughed","regor","insolvent","ninnies","truckled","birthplaces","telescopic","abelson","puritanism","leanings","disturbingly","transmission","mortify","upshot","newlywed","adam","ballplayer","lockwood","quirking","blocs","theatre","palliatives","smudges","marvelled","ramble","offside","indissoluble","droplets","fencing","hubbard","estimation","incorrect","malarial","confucian","games","sacraments","trivets","gammas","nastiest","merrymakers","sealskin","overkilled","bosser","strafe","exclusives","bouldered","antiwar","guitarists","jerry","earthly","oscilloscope","edmonton","merger","laminated","surmountable","casually","backspaced","charcoals","overheating","caramel","oldened","asterisked","tun","peafowl","purplest","skippering","prep","congregating","glaringly","crummiest","noreen","bromide","nomenclatures","kristin","purportedly","vamoosing","busybody","crucify","capote","milliners","veils","windsurf","reconnecting","layering","ossified","noble","tiptoeing","smiles","swain","perihelion","bagels","obfuscation","spreadsheets","buddy","flints","planting","hogwarts","abusers","welfare","mouses","lament","auras","unrelieved","cougars","cattails","chubby","handstands","woolly","concealment","mediterraneans","judas","electrocardiographs","skulks","puttered","crimean","liven","odds","warehousing","lifeguard","deepness","clowns","blossomed","constriction","honest","noisemakers","whist","overcame","sulphured","vertebras","commiseration","jolted","adjourns","bungles","sonnies","housekeeper","buddha","bolsters","warlords","banjarmasin","militated","anywheres","lula","weirdos","raymond","sections","taoisms","pay","latest","bights","carousel","sups","lavatory","conciser","lon","beefburger","clinically","snakes","backslash","developmental","squibb","smote","mastectomy","genius","sallying","niagara","guild","altai","ascetics","marts","misbehaved","desired","pagodas","platypus","freemen","lovemaking","transfers","brewing","absorbents","unions","lite","wilder","popovers","yamaha","faultier","supplements","forsythia","rummy","propagation","motorbikes","velez","unequivocally","lend","silliness","idiosyncratic","disseminated","carter","washed","dizzying","bedsore","pawned","lr","nubile","galloped","subservience","marlin","chance","schooners","faction","clutters","transmits","weathercocks","illustrations","quell","senegalese","touchiest","psychs","joshes","shallots","garrottes","coifs","glaswegian","hydrated","smirch","strutting","arnold","coughing","tangier","olympics","overexposing","benefactor","reputably","snootier","smuggles","bogus","priories","chandra","diplomatics","muskrat","forbad","monasticism","outshone","farewell","thomas","epaulets","nectarines","affording","buckles","concordance","lebesgue","pawed","lackey","sweden","confirmatory","humble","wizards","controlling","scoffing","worthy","homely","lexical","batteries","chorusing","inboard","cotton","lustrous","devalued","herbart","travestied","veneered","maxillas","omelet","ptarmigans","alnilam","submerging","bucks","niceties","yong","gender","toileting","biding","caffeine","lubricant","dashikis","balm","filings","series","paraguayan","fatefully","craggier","oversexed","milkweed","passels","concretely","rapiers","channeled","multifaceted","tenth","conflagration","pivoted","horribles","tugs","fireman","hull","semifinalist","odorous","carats","uncomfortably","clappers","chaffinches","demagnetize","limits","ups","wimp","reserved","busyness","illuminate","autocratic","zips","sculley","vainest","conciliators","vacillations","daughter","beau","stashes","mini","shallow","divided","invert","caesurae","vibrantly","germination","winching","curmudgeon","hurts","battens","lovable","redistricted","neighing","nonexistence","foghorns","manifesting","retrofitting","fictitious","gracefully","shetlands","transistors","rectitude","shea","acquisitions","predetermines","huts","blintze","cortland","murdered","leninism","ninetieths","fractal","inveighs","compelled","ringer","mistiest","snorting","transportation","dictionaries","khyber","misspelling","bifocal","playmates","disputant","neuters","epidemics","vijayawada","ambles","splashdowns","cants","bandannas","millennia","glows","fowled","cupped","laramie","occupied","gelatine","scorches","sidelights","beagling","campused","doer","gunfighting","tsitsihar","marin","fireside","yellow","seagram","strap","arrivals","sixty","lipscomb","wares","awfullest","servants","dreamer","crockery","mahavira","brad","outpourings","dusty","shrubs","briefest","segments","cartilages","excommunicated","generator","placket","berate","emulations","suspicious","fortnights","sped","griding","panting","trimaran","suspend","retract","adversity","regimental","hammett","wallflower","tyrannize","cinemascope","ambassador","humerus","litter","trying","sinkable","descents","coveralls","region","landslid","bowed","zigzagging","upholstery","parch","scratchy","altitude","angling","scaldings","plussed","babel","cirrus","haberdasher","gayle","chillest","catboat","battling","bellini","extincts","appendices","unmade","footstool","deaths","secretively","erasmus","agra","soothsayers","stillest","despoils","affiliated","mumble","aleut","gyp","purchased","kory","cesspool","interacted","demarcates","fanciness","defines","absorbed","fireplugs","pluckiest","misstates","grenades","untidiness","ventricles","overexpose","dryad","tumbler","chengdu","thistledown","dork","unauthorized","holmes","downgrading","syphilises","trammelled","sending","afflict","ornithologist","serried","much","emoluments","wilfully","strayed","canada","dachshund","compost","glamorized","gerrymandering","senate","allots","arsonists","coloratura","borderlines","cartooned","evert","continents","profiteers","merritt","cyclical","quickens","funkier","dourer","salmonellae","seemingly","cheeky","showering","proses","imperturbably","gush","intolerable","wozniak","vegetables","neglectful","aesculapius","whimsicality","unfolds","conceited","junkyards","immanent","norbert","pollsters","ruse","gymnosperms","toothbrush","accommodate","multitudinous","blessedest","squeezers","portal","newspaperwoman","polytheistic","affectioning","rhiannon","holing","johanna","gregariousness","fishtail","tainting","wasteful","aeneas","flycatcher","salem","ventilator","sat","hiroshima","breed","housewarming","migrate","smocking","plethora","fathead","mussy","communion","foxhole","renters","telecommunications","obtusest","puncture","preparing","encyclopaedias","footholds","violets","megalomaniac","dakotas","accentuating","joanna","gentleman","dardanelles","aeration","gerrymander","liker","chatters","questioningly","guesswork","lunar","upgrading","mara","consultancy","sanguines","sunks","polyethylene","injected","aneurysms","caterwaul","eventfully","aquariums","yowl","valeria","suicides","emptiness","pajamas","uphill","myles","playfully","palestine","agape","chichi","vatican","exponentiation","shipper","planes","reprints","dieters","involving","dimwitted","cranach","homestretch","fitfully","fluoridation","esthetics","coworkers","cannibalize","lipids","heartsick","flatware","rage","hazier","overburdening","psychosis","wage","debasements","personalized","itaipu","valletta","rhythm","cyclic","hillocks","badlands","proffer","cretin","sexuality","hefts","rehabilitate","disfranchisement","skews","rundowns","unrolls","dividing","boomerang","gigglier","respects","layette","heads","devised","franny","therapists","ballsy","inkier","passer","capone","housebreak","rachel","portered","palpate","bugles","marionettes","werewolves","primitive","powerboat","polio","wylie","industrial","convenes","sweep","wear","peaks","trudging","manuring","yttrium","hometown","graving","latency","warrant","tinsmiths","preheats","withered","priestley","dipper","overtakes","thurber","softwood","renounced","turfed","immensely","pilgrim","neophyte","mendicant","trampolining","detachable","corralling","haydn","victimizing","pockmarks","goya","triumphs","sleet","whiplashes","inconsistent","slaked","handled","nissan","housecleaned","gentling","alexandra","dallying","kiddos","rayleigh","oxen","boarders","demonstrator","mollusk","micawber","earthshaking","burials","consecration","algeria","sinister","bloodcurdling","garrotted","byte","dungeon","ferrets","trunk","finery","dodos","staid","champagnes","gelt","hedonists","barrier","trikes","lock","scaly","hibernation","lopsidedly","snake","ellison","runabout","rhapsodizing","divinity","bugged","entomological","kazoo","powdered","smeared","shoestring","knocker","galbraith","clomp","rudders","infused","sale","silicone","underfoot","chirruped","beatific","preached","commingles","enchanters","nonflammable","vacillating","autistic","uganda","intruding","expatiating","coddles","attendant","races","paying","confuting","guyed","expanded","tolstoy","contestants","judd","comediennes","pansy","upstage","schoolmistresses","lesion","rollback","rapt","sicked","locomotion","flint","interactions","vaginae","intonation","comedic","totaled","sickles","immensities","leastwise","brothers","rinking","worksheet","impending","mussed","reinterpretation","backtrack","thrummed","devastate","plaiding","accusatory","rafts","stew","infringe","impulses","shuffleboard","decaffeinates","marquez","milksop","artisan","attlee","decide","italic","catalyst","squeamish","transmuted","coffer","sadness","forays","slipperier","bella","dandy","singletons","inflating","pittance","shearer","spilling","acid","mortgager","proverbs","wily","headwinds","murmured","humidified","cramping","herrick","phoneticians","boas","bucksaw","play","falters","overbites","dill","renovators","mush","clockworks","diaspora","favorites","stomachaches","flinch","boston","scrounges","hubert","utters","million","weekended","touchdown","reactor","postcards","brown","snide","banjoist","recourse","deuced","scurrying","chihuahuas","abutments","proliferate","carillonned","saucier","kaposi","amanda","fillet","demographics","eldon","skyed","abut","bernadette","downplays","alluvia","trappers","insofar","breathlessness","insistently","imitative","cede","embargoed","boisterousness","edicts","braise","impacted","ukrainian","lankiest","bounden","trilling","pinnate","unconvincing","kent","indulging","stagnant","piston","cookery","commits","caucasoid","fronds","bootless","clustered","giggled","lugubriousness","intents","elms","boorishly","stalemate","blaine","proportionality","sampson","ethnologists","francisco","headmistress","propel","knapsack","misapplied","ensnare","subtotal","intersected","maud","shooing","pouts","messed","schmidt","liberated","continuations","impossible","unsatisfied","flanneling","unscrupulous","comity","scopes","incised","venial","takes","auction","bashfully","bremen","televangelists","eyesight","ineptness","hecate","sweller","carrot","presidency","hook","nerveless","mastication","abstractnesses","precognition","indent","sombre","fieriness","quiescent","indispositions","shiftiness","caveatted","gulps","best","spread","chews","prevaricating","shoon","manicures","privier","yawns","surnames","solacing","tattering","contrail","downsizing","unnerve","avenger","misanthropists","retiring","roughest","canard","dowdiness","corinne","hilton","summon","whacky","luncheonettes","morals","hunches","ibices","waded","meany","valving","articulations","typefaces","born","wretches","reflexes","tickled","showier","reddest","scallop","rethought","registries","behaves","abnegates","sharping","helm","rapscallions","manifestation","elected","mulligan","unmanageable","exude","centerfolds","unbind","enshrine","skeptically","pained","yeah","frostbiting","nonessential","bakers","exorcist","tonalities","timmy","provisional","bugatti","whisper","nonfiction","snippet","quest","jabberer","mittens","metatarsal","quotient","sponsorship","ferociously","brig","meditation","scotch","mess","saith","appropriately","smithson","emacs","bookending","misses","warmonger","subvert","pretties","ficklest","inaugurated","teetotal","shipmate","irony","canaan","jeopardized","lanes","sloan","connexion","ideals","uprising","sited","lamebrains","patchwork","vocalizes","maura","taller","patronage","barbarians","midshipmen","granddaughter","grapefruits","sideways","mistreating","pensive","foreseen","manageability","lammer","affiliation","aguilar","aunts","ghats","tricycles","privileged","athlete","ls","colonnades","constrictors","stickied","ritualism","catharses","scrappiest","almoravid","tiaras","habituate","merino","witches","handbag","steamroll","conics","marion","forte","rectangles","australoid","gaborone","invidiously","fugues","nervelessly","p","plunderers","newspaperwomen","embolism","splendider","lathes","pleistocene","acceleration","caterers","hauled","fluent","severus","dubbed","rollicked","cal","hastily","scourged","homogenization","leakages","teaches","vocabulary","interpolate","bacterium","ambiguous","virtual","flory","apostrophe","bellamy","lushest","misconstrued","obsessives","romanticizes","feeblest","encodes","anthropologists","clinked","hammerstein","duckbill","expurgations","coroner","unclasping","inconsistently","default","skullcaps","inverses","toadstool","raga","cristina","malady","nonrenewable","zonal","suva","trothed","clarifies","moravia","waggles","flyspeck","blanker","overstays","admired","speckles","fumigates","languished","dieseled","president","tuition","escapees","meyerbeer","futilely","pills","afghans","homeboys","blankness","hackles","footman","spies","horsed","arctics","sunder","mcluhan","secures","withdrawn","bellicose","quibbles","chastens","episcopate","shenanigans","salinity","mending","handsome","tweed","ladle","condorcet","metric","tattletale","rashly","nurtures","contemplation","tucker","moroni","nickolas","mcclellan","phonics","copyright","overwhelms","swahilis","chessmen","amusingly","conjoint","abstrusest","canonicals","ono","callouses","jiggled","typecast","memoranda","tuxes","stalwart","ennobling","nuked","gaggle","followings","beeper","hacksawing","acclimatize","orient","declaims","rising","enamor","doxologies","waistcoats","gustatory","kitchening","overpower","subordination","bone","ricking","yenisei","harvesters","junior","elector","simulcasted","clarinettists","modulators","happily","critic","damage","ineffectual","arbitrates","portrayed","animists","monasteries","abductor","dissolve","befuddled","emergence","laments","naturally","ankle","glastonbury","woodpile","zoroastrian","near","orneriest","temperated","icon","stiffed","penis","reapplied","getting","specializes","bushy","complaisant","slocum","unreadier","stiffest","fives","clumsiest","engineers","plumped","waistline","judgeship","cryptographers","bordello","babar","monthly","possiblest","libeler","cartwheeling","stiffer","monickers","digraphs","salinger","carping","wrigglers","assyrians","sprawls","visits","saunaed","preambling","flairs","obtuse","unbounded","septuagenarians","syllabi","roulette","conjure","clones","aristocratic","orleans","discountenancing","primordials","expropriations","patellas","prurient","walloon","electroencephalographs","contribution","dwarfed","caryatides","billy","presumed","gnarly","chinchilla","shinning","gripped","sigurd","ruff","circumcising","shriveled","cysts","bernstein","storming","calibrations","suffuse","stodginess","brownian","colorblind","aberration","cornered","droppers","heartbreaks","becker","suffusion","ambassadorships","souses","arizonian","oarlocks","accountants","elephants","surer","citadels","betroths","gentian","individualism","venezuelan","tour","rancorously","cabral","constants","parochialism","fustian","coxswains","ironing","rusted","babbling","inapplicable","sedans","leukocyte","opaqueness","bluffs","tuneless","capsized","brochures","severance","hyperventilated","len","shortstop","adoringly","damming","credits","accentuates","lurch","illegitimacy","martens","bleeders","rankle","mortarboard","unify","remark","thermometers","provoked","bittersweet","dame","clarinets","workers","misinterpreted","surveillance","thickset","assaulted","intervening","swede","rustbelt","suns","gasoline","clifton","energized","indiscreetly","soundless","notepad","uneaten","cicatrixes","rhythms","inimitably","subjectively","drifter","snowdrop","moonstone","olga","sabled","eightieths","yonder","inaccurately","madams","flautist","surrealist","persimmons","davenport","retinues","markets","cursing","femora","sharpers","fishermen","cores","clarifying","lakes","sake","sync","impinged","smartness","retarded","grubby","okayed","rustles","croupiers","civilizing","suffocatings","blackmails","recessives","substantives","profitable","delicatessens","familiars","terence","frumpier","maximums","shiners","regals","stieglitz","newsagents","confirmation","inebriation","alva","snowplowing","crudity","tams","gobs","sourpusses","pursuant","busts","angrily","betaking","subsumed","uniformity","mote","censuring","sir","sifting","yachts","sexists","orientation","forewarned","brigs","gyro","knickknacks","retrains","klondiked","nonpluses","contemplative","sears","trammed","serializes","brigands","stratified","burial","sumter","malplaquet","upholsters","parenthesized","dinkies","classy","jugulars","contradicts","sunup","terracing","bulletined","postponements","teenier","afterburners","greenback","dependants","hardy","unbelievers","surrealistic","chaises","snapple","dowry","writhes","expurgates","magically","toolkit","boondoggled","timorously","fuselages","corine","deploying","neckerchiefs","oz","sequoya","waives","dives","reprocessing","clearly","discontinuations","mezzanines","antibiotic","likeness","squabbles","navigable","temples","described","libretto","tanking","perilous","drowsiness","pilferers","beakers","ingram","prevaricate","voiced","procrastinated","vanilla","salween","han","marquises","bewails","cocks","ledger","panty","dupont","typewriter","blackfoot","possession","conglomerated","collects","escutcheon","titting","condiments","smouldered","marquees","interjected","element","outlet","briefing","liquidator","shrieks","nanking","salting","reopens","glasgow","arabians","transgressing","reasoning","bleated","bearable","criticize","whereat","bureaus","dismounts","roxie","tussled","yeomen","equine","cyclist","hugely","felted","messy","desist","shenandoah","sushi","storeroom","hindquarter","opposed","benevolently","archives","luaus","diskette","chiefer","hangover","sparta","faxed","hedge","eddington","pins","bushiest","loco","rooking","lifer","trespassed","swears","husked","darrell","completed","shirring","interactively","places","injured","stolid","secondly","explores","committees","airwaves","littler","sprawling","hydroplaned","uglied","depended","mortared","gloaming","shinbones","outlaw","proselytize","moralling","worn","extricates","exclamatory","layperson","frolicsome","conjugates","arrest","guttural","paycheck","phyllis","alphonse","drumming","multiply","wed","actuating","sidled","sapient","fingers","wantonness","habitually","emulsion","handwork","indeterminate","prig","pareto","wartime","nuthatches","squalider","selflessness","chip","uvulars","debonair","replenishing","naughtiest","renounce","anemic","schoolgirl","dilation","slipping","tape","ginning","crucifixions","indecisiveness","formidably","pokes","resigned","chitchatted","holograms","coppices","dialects","vicissitudes","penologist","shirtwaist","heeds","hybridizes","calliope","likable","adequately","wight","heehawed","exhibits","undressing","seditious","collapses","perishes","peevish","foregoings","harsher","effectuate","halls","petitioned","afrikaners","bright","holidayed","subtitled","comfortable","whoa","aspens","mops","islams","valedictorians","jellies","jewel","gouging","leftmost","breaches","minimal","overcharged","porting","smith","predominates","motorbike","enigmatically","equable","trickery","streetcar","flautists","countrysides","disregarding","pakistanis","grapevine","chicana","maneuverable","diction","falsified","peppering","murmurs","abated","radiance","maharajas","pediments","entrants","friedman","discombobulated","misprints","reimbursements","andropov","fizzle","stress","sifters","establishments","chippers","boomed","describable","contused","moscow","stonewall","meander","kaleidoscopes","subcontract","physiognomies","bayeux","telegraphic","emotional","govs","crotches","jayne","morison","funguses","schlepped","rhubarbs","bump","banged","shrieked","petal","phooey","piercings","defending","lapidaries","muffle","halcyon","transmitting","smallest","tottered","bossily","ruling","sequencers","lowest","overtaxing","misalignment","plutonium","paroling","windsurfs","annals","nasser","gomorrah","dispute","intensity","unwillingly","witt","stockiest","addends","jacklyn","kind","giauque","reborn","discontinued","headdress","favorite","vivaces","keith","descriptions","secondarily","whinnier","kismet","underrates","restated","guessed","inestimable","irritable","managua","deft","blockbusters","ascribes","melodramatics","cormorants","deliquescent","unpins","twits","confers","bargained","tide","floundering","censorious","gouges","magistrates","reynolds","sequels","as","incinerator","swathes","candelabras","spelling","scratchier","dejecting","implementation","reaffirms","blanches","western","ebony","reason","appending","polluters","jove","gambits","corpuses","grittier","rhetoricians","distils","explicate","jansen","jolt","curing","medicine","tender","supplanted","andres","scrofula","glopped","indulgently","pilchards","scuffs","harmonize","hoagies","xmases","witness","caller","detail","mayo","misidentify","bath","disports","filets","cheapest","scorpions","prevent","promptness","looping","authenticating","cab","reamers","protestation","outgrown","devoting","naphthalene","quarrels","rambler","garment","councilor","chronic","acceptances","resurrection","southpaw","raceway","diffidence","uneventful","mecca","cheri","scarceness","nebraska","elfin","bookies","dietary","auditory","eggo","articulateness","steadying","boulders","impressing","misdo","greta","comae","horace","pedalled","tram","sahib","fetishists","dumbness","belonged","rotunda","moons","falconers","rail","dispels","redeemer","petitioners","forewent","onshore","precincts","detoxes","quintupling","befouling","knit","balls","eddy","poetess","divines","candor","tomcats","weapons","unsnaps","viaducts","chatted","susie","reconvened","condemns","thickeners","collect","rock","apothecary","clue","mulberries","territories","pups","earthing","pledged","coffers","wells","extractors","mistiness","sterility","microfilming","anesthesiologists","miss","volleys","nabs","foamier","wrested","minefields","empathizes","lakshmi","victualling","huffiest","shirrs","centralizes","inapt","besieging","babbitt","psychoanalysts","gybe","enlisting","discomfits","helicoptered","sukkot","skidded","avoirdupois","horsewhipping","khulna","plateaus","rwandan","emerson","copycatted","herald","bemuses","hesitate","gleefully","siestas","tonsure","generals","flunky","eyes","indivisibly","hydrangea","berne","gag","redesigned","insinuating","reenters","remote","douche","budget","afterlives","shootout","shortbread","eatables","omens","abelard","waxen","presaging","platforms","beachheads","redeveloped","praia","peppy","indonesians","plated","abouts","sunbathed","mobiles","playacted","files","verlaine","deceptively","townsmen","acetic","resorting","ritually","rhinestone","neologisms","opposition","cauterizing","sprinkling","theoreticians","khoikhoi","peahens","compensated","shrive","roughage","drastically","objector","manliness","lanyard","espied","saturate","canards","launderer","hightailed","hauler","frosty","blithely","astrophysicist","squirrel","derailing","huffily","suture","mahatma","egocentric","reverting","doctors","anubis","flatly","minuter","staterooms","delineate","rive","offbeat","principals","micra","invoices","menominee","cartographer","ujungpandang","notoriously","reapplying","totalled","whiskers","crassness","incoherently","grassiest","sponging","protects","numeration","preppy","ceased","powering","recreates","musicians","header","bounteous","negligently","berenice","trustfully","methinks","preface","disproportionately","comeuppances","firefighting","synced","disturbing","tuscan","robles","factored","aircraft","nazca","shrank","panhandler","oversleeps","huckleberry","countersank","hopper","paneled","kayaking","billowy","inhalers","sapped","rarefy","thunderclouds","rockets","imperiously","dregs","hockshops","stemming","nymphomaniacs","tightening","refreshing","ryder","persecutor","win","darted","benchmark","abuzz","incises","brunei","scuttled","astronauts","pizazz","covetously","maltreating","barbarism","manila","zuni","humanizes","microcosms","fellow","exonerate","geckoes","foregone","cuttings","butterflying","underflow","saintliness","slather","toddle","isobars","spelunkers","rigmaroles","offings","interning","representative","luann","pursuit","tennis","marijuana","reconvening","shapelessly","strum","kilts","brutalized","gloom","rajas","courses","poising","disclaimers","baluchistan","brief","recognizable","gore","outermost","ascertainable","pitfalls","posers","vegetable","inglorious","mottos","hurtle","heartbreak","chichier","bolshevist","cockscomb","delineates","spouted","asides","chrystal","presentiment","pekings","teargas","classes","foamed","distinguished","sherlock","purling","apace","goalies","specifiable","enfranchised","cycle","crunchiest","ericson","membership","sheraton","reaffirmed","lassie","readily","gunfire","archaism","bulged","watercraft","internal","dishonors","caviled","volcanic","blahs","instances","yammers","colombians","mussier","allegheny","contraband","heinrich","dogged","impossibility","syntactic","infuriate","max","specifically","brent","eugenics","ankhs","icelander","woodshed","emblazoning","thru","overhearing","ultrasuede","hillock","twitching","dishonoring","gridlocking","grouches","sequestering","pressurized","freeloads","ursula","carpet","formulation","aliens","warbling","frazzling","furnishes","abridged","theocracies","karamazov","abridgements","adipose","wideness","lacing","adversaries","prohibitions","nosy","inopportune","radiotherapists","extortionist","relabels","bullish","diagraming","bracing","scrounged","seniority","congregationalists","incompatibles","cavalcade","allergist","stippled","salaciousness","crazily","snuggles","deserve","squashiest","waterfowls","carjacking","trampolined","sister","swankier","kazakhstan","blaspheming","kidnappers","disorganizes","elongated","glopping","windbag","buckeye","rebellious","leaf","biographer","verily","downpours","baxter","qaddafi","suffocated","drowns","doses","rebated","amplifying","paprika","played","midwifed","nightfall","rocketing","solemnizing","pacifiers","alaska","snicker","small","hotshots","jumbos","leagued","subpoena","sivan","overbalanced","rasalhague","washbasin","imponderables","packers","consecrate","majorettes","clarendon","fain","pettifog","bessie","reword","genoa","storey","ezra","shutting","legitimately","obsequies","leggy","diodes","mechanizes","buggies","disavowal","jaunties","johnnie","ladyship","epiphany","probabilities","bucketing","tomboys","slackens","womanizer","venn","toddling","hustling","tattle","bikes","mouthe","daryl","succumb","geffen","honeymoons","denmark","caucasians","introverts","verdure","plausible","conjuror","insetting","aftermath","withers","miller","interdepartmental","decalogue","liquefies","recreated","holographic","median","pidgin","matchless","skinnier","milligram","psychic","titted","consecutive","reject","inhales","colossal","tintinnabulation","virgil","fiduciary","friday","resumptions","rambling","ilene","bordeaux","swaying","giacometti","succeeded","hobbies","photocopying","reinvests","chiselers","respire","dodoes","vaporous","gloried","unproductive","salami","argots","allege","mutinous","mirfak","keepers","hocked","primness","tubers","improvidence","soil","discontinuing","landslides","mollycoddling","smokier","corolla","ripper","splenetic","convening","twangs","snootiest","rousing","stablest","ordinarier","windiest","quizes","tallahassee","hutchinson","becomingly","attentively","sourcing","guppy","demands","lupins","ladders","liechtenstein","emancipated","toughness","maladjustment","bringing","clopping","acrylic","undervalues","bogy","juggles","proprietor","assertions","snobbishness","overcautious","bernie","pylons","enmity","westerns","hobbyhorse","edgy","probing","footsore","cagney","rumpling","engorges","holdover","lyman","ambiguously","boding","adulterous","intriguing","capstan","punitive","stiletto","monotony","weathercocking","torturing","sixtieths","inkling","nutritionist","akron","habits","eyries","ukraine","curlicues","sate","rosendo","seclude","commended","truthfulness","fender","shekel","unrelated","crouch","crueler","kiss","intimately","encumbered","shell","spotters","nosegay","goatherds","pasadena","dropouts","forgathers","predestination","gigglers","invulnerable","negros","workman","onomatopoeia","leaking","immediate","retraces","subheading","fanciers","wield","sacrosanct","sauerkraut","chinatowns","bimonthlies","mistrial","watchtowers","muddle","copernicus","nonuser","amassing","infantries","lead","tantalus","anemones","callahan","bombastic","noise","giantesses","damien","nietzsche","sects","limbs","attire","thickest","deducible","space","fenders","blackballs","slashing","signatories","bast","mousetrapping","motor","bothers","trunks","destine","coursing","kipper","dressmaker","ghanaian","sheathed","sward","mishandle","ferrari","georgian","nearsightedness","chestnuts","basketballs","suffered","yardarms","verses","apothecaries","tequilas","excavated","beauregard","floating","unruliness","certificates","tens","literate","watchfully","tartars","moaning","currant","instincts","codify","sachet","looks","bedrock","roundelay","candidacy","tragicomedies","hollyhocks","pummels","sheldon","swayed","misfired","botany","vane","retrospect","bully","divots","tailgating","outbreaking","varmints","sorcerer","terminal","stein","inland","suggesting","octavia","catalysts","cover","pulsated","incommensurate","northrop","cranked","preemption","sturdily","melons","unicorns","shadiest","mythology","kaboom","orate","soppings","fountainheads","chitchatting","jo","idealism","accordions","constrains","steakhouses","acquited","underlying","tunes","patagonian","untilled","thankfulness","pummeling","undergarment","rodger","walkout","casualties","slews","hiking","funded","catchall","critiquing","flirtatiously","soberly","cherry","disbelieve","longhorn","scuttle","yell","fit","discomforts","cheeriest","masterly","vapors","sulkiness","sign","obsequiously","tryout","stethoscopes","radiators","wrangled","subverting","grievances","typographical","oahu","kaolin","constellations","transnational","efrain","pylon","committal","disables","climatic","taoist","moldiness","scrutiny","mulatto","misstatements","brontosaur","viticulture","waistbands","sharks","trowel","hall","scuppers","stations","buggiest","sole","slyest","london","smokies","shuttlecocks","irreverently","sunfish","befogs","arraigns","uneasy","cadavers","brights","photojournalism","commissioners","gate","idealizes","chaparral","veronese","misguidedly","maker","biophysics","maced","excite","carousals","apes","cruel","bohemian","epigrams","allocate","goldie","grams","porfirio","wears","senecas","weirdly","synthesizer","creditor","chowed","smithies","omnivore","cocktail","isis","derailment","outspokenness","immigrating","snivel","outgo","stopwatches","vibrators","dustbin","gentlest","commune","unregulated","vaccinates","stern","coagulates","pyramidal","ill","intensifier","sweltering","maritza","needlework","stolidly","bantams","missive","relearning","honeycombs","straddles","portraits","active","ceiling","repackaging","malfunctions","bavarians","emanates","flaunts","revision","ceded","hous"};
  4816. strs1 = new String[] {"", ""};
  4817. s1 = System.currentTimeMillis();
  4818. List<String> list3 = anagrams(strs1);
  4819. s2 = System.currentTimeMillis();
  4820. System.out.println(list3.size());
  4821. System.out.println("s2 - s1 = " + (s2 - s1));
  4822. System.out.println("solve Queen");
  4823. List<String[]> result1 = solveNQueens(4);
  4824. for(String[] queens : result1){
  4825. System.out.println("");
  4826. System.out.print("{");
  4827. for(String q : queens){
  4828. System.out.print("\"");
  4829. System.out.print(q);
  4830. System.out.print("\",");
  4831. }
  4832. System.out.println("}\n");
  4833. }
  4834. int numberOfSolution = totalNQueens(4);
  4835. System.out.println("numberOfSolution=" + numberOfSolution);
  4836. numberOfSolution = totalNQueens(5);
  4837. System.out.println("numberOfSolution=" + numberOfSolution);
  4838. System.out.println("Test maxSubArray");
  4839. System.out.println(maxSubArray2(new int[]{-2, 1, -3, 4, -1, 2, 1, -5, 4}));
  4840. System.out.println("Test sprial");
  4841. int[][] matrix = new int[][] {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
  4842. matrix = null;
  4843. matrix = new int[][] {};
  4844. matrix = new int[][] {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}};
  4845. List<Integer> list4 = spiralOrder(matrix);
  4846. for(int n : list4){
  4847. System.out.print(n + " ");
  4848. }
  4849. System.out.println("Test canJump");
  4850. System.out.println(canJump(new int[]{1,1,1,0}));
  4851. System.out.println("Test insert");
  4852. List<Interval> intervals = new ArrayList<Interval>();
  4853. intervals.add(new Interval(2, 4));
  4854. intervals.add(new Interval(5, 7));
  4855. intervals.add(new Interval(8, 10));
  4856. intervals.add(new Interval(11, 13));
  4857. Interval newInterval = new Interval(3, 8);
  4858. intervals = insert(intervals, newInterval);
  4859. System.out.println("Test getPermutation");
  4860. // System.out.println(getPermutation(3, 1));
  4861. System.out.println(getPermutation(9, factorial(7)));
  4862. // System.out.println(getPermutation(3, 3));
  4863. // System.out.println(getPermutation(3, 4));
  4864. // System.out.println(getPermutation(3, 5));
  4865. // System.out.println(getPermutation(3, 6));
  4866. System.out.println("Test isNumber");
  4867. System.out.println(isNumber("e9"));
  4868. System.out.println(sqrt(9));
  4869. System.out.println("Test climbSteps");
  4870. System.out.println(climbStairs(15));
  4871. System.out.println("Test simplifyPath");
  4872. System.out.println(simplifyPath("/home/"));
  4873. System.out.println(simplifyPath("/a/./b/../../c/"));
  4874. System.out.println(simplifyPath("/../"));
  4875. System.out.println(simplifyPath("/home//foo/"));
  4876. System.out.println(simplifyPath("/..."));
  4877. System.out.println(simplifyPath("/home/../../.."));
  4878. System.out.println(simplifyPath("/home/foo/./bar/"));
  4879. System.out.println("Test setZeroes");
  4880. //int[][] matrix1 = {{Integer.MAX_VALUE, Integer.MIN_VALUE, 160,16,488}};
  4881. int[][] matrix1 = {{Integer.MAX_VALUE, Integer.MIN_VALUE, 160,16,488, -1, 2, 3}};
  4882. StringUtils.printMatrix(matrix1);
  4883. setZeroes(matrix1);
  4884. StringUtils.printMatrix(matrix1);
  4885. System.out.println("Test searchMatrix");
  4886. int[][] matrix2 = {{1,3}};
  4887. System.out.println(searchMatrix(matrix2, 2));
  4888. System.out.println("Test sortColors");
  4889. //int[] B = {2,2,2};
  4890. int[] B = {0,1,2, 2,1,1,0, 2,1, 0, 2, 1, 0};
  4891. StringUtils.printArray(B);
  4892. sortColors(B);
  4893. StringUtils.printArray(B);
  4894. //
  4895. // System.out.println("Test combine");
  4896. // List<List<Integer>> list5 = combine(4, 0);
  4897. // for(List<Integer> list55 : list5){
  4898. // StringUtils.printList(list55);
  4899. // }
  4900. System.out.println("Test subsets");
  4901. int[] S1 = {4, 1, 3};
  4902. List<List<Integer>>list5 = subsets(S1);
  4903. for(List<Integer> list55 : list5){
  4904. StringUtils.printList(list55);
  4905. }
  4906. System.out.println("Test minWindow");
  4907. System.out.println(minWindow("adobecodebancbbcaa", "abc"));
  4908. System.out.println("Test exist");
  4909. char[][] board1 = { {'A', 'B', 'C', 'E'},
  4910. {'S', 'F', 'C', 'S'},
  4911. {'A', 'D', 'E', 'E'}};
  4912. String word = "ABCCED";
  4913. System.out.println(exist(board1, word));
  4914. System.out.println("Test removeDuplicates2");
  4915. System.out.println(removeDuplicates2(new int[]{1,1,1,2,2,3}));
  4916. System.out.println("Test largestRectangleArea");
  4917. System.out.println(largestRectangleArea(new int[]{4,2,0,3,2,4,3,4}));
  4918. System.out.println("Test maximalRectangle");
  4919. char[][] matrix3 = {{'1'}};
  4920. System.out.println(maximalRectangle(matrix3));
  4921. System.out.println("Test isScramble");
  4922. t1 = System.currentTimeMillis();
  4923. // System.out.println(isScramble("tqxpxeknttgwoppemjkivrulaflayn", "afaylnlurvikjmeppowgttnkexpxqt"));
  4924. // System.out.println(isScramble("abcd", "bdac"));
  4925. System.out.println(isScramble("tqxpxeknttgwoppemjkivrulaflayn", "afaylnlurvikjmeppowgttnkexpxqt"));
  4926. System.out.println(isScramble3("a", "b"));
  4927. // t2 = System.currentTimeMillis();
  4928. System.out.println("t2 - t1=" + (t2 - t1));
  4929. System.out.println("Test grayCode");
  4930. System.out.println(numberOfBits(5));
  4931. List<Integer> result2 = grayCode(5);
  4932. for(Integer x : result2){
  4933. System.out.print(x + " ");
  4934. }
  4935. System.out.println("\nTest numDecodings");
  4936. t1 = System.currentTimeMillis();
  4937. System.out.println(numDecodings("101"));
  4938. // System.out.println(numDecodings("9371597631128776948387197132267188677349946742344217846154932859125134924241649584251978418763151253"));
  4939. // System.out.println(numDecodings("0"));
  4940. // System.out.println(numDecodings("3"));
  4941. // System.out.println(numDecodings("20"));
  4942. // System.out.println(numDecodings("30"));
  4943. // System.out.println(numDecodings("12"));
  4944. t2 = System.currentTimeMillis();
  4945. System.out.println("t2 - t1=" + (t2 - t1));
  4946. System.out.println("Test subsetsWithDup");
  4947. int[] S2 = {2, 1, 2};
  4948. List<List<Integer>>list6 = subsetsWithDup(S2);
  4949. for(List<Integer> list66 : list6){
  4950. StringUtils.printList(list66);
  4951. }
  4952. System.out.println("Test reverseBetween");
  4953. //1->2->3->4->5->NULL
  4954. ListNode head = new ListNode(5);
  4955. for(int i = 4; i >= 1; i--) {
  4956. ListNode h1 = new ListNode(i);
  4957. h1.next = head;
  4958. head = h1;
  4959. }
  4960. head = reverseBetween(head, 2, 2);
  4961. while(head != null){
  4962. System.out.print(head.val + " ");
  4963. head = head.next;
  4964. }
  4965. System.out.println("Test restoreIpAddresses");
  4966. List<String> ips = restoreIpAddresses("010010");
  4967. for(String ip : ips){
  4968. System.out.print(ip + " ");
  4969. }
  4970. System.out.println("Test numTrees");
  4971. System.out.println(numTrees(10));
  4972. List<TreeNode> trees = generateTrees(0);
  4973. System.out.println(trees.size());
  4974. for(TreeNode n : trees){
  4975. printTreeNode(n);
  4976. System.out.println("");
  4977. }
  4978. String s11 = "bbbbbabbbbabaababaaaabbababbaaabbabbaaabaaaaababbbababbbbbabbbbababbabaabababbbaabababababbbaaababaa";
  4979. String s22 = "babaaaabbababbbabbbbaabaabbaabbbbaabaaabaababaaaabaaabbaaabaaaabaabaabbbbbbbbbbbabaaabbababbabbabaab";
  4980. String s33 = "babbbabbbaaabbababbbbababaabbabaabaaabbbbabbbaaabbbaaaaabbbbaabbaaabababbaaaaaabababbababaababbababbbababbbbaaaabaabbabbaaaaabbabbaaaabbbaabaaabaababaababbaaabbbbbabbbbaabbabaabbbbabaaabbababbabbabbab";
  4981. // String s11 = "aabcc";
  4982. // String s22 = "dbbca";
  4983. // String s33 = "aadbbcbcac";
  4984. // s33 = "aadbbbaccc";
  4985. //
  4986. // s11 = "aabcc";
  4987. // s22 = "dbbca";
  4988. // s33 = "aadbbcbacc";
  4989. System.out.println("Test isInterleave");
  4990. t1 = System.currentTimeMillis();
  4991. System.out.println(isInterleave(s11, s22, s33));
  4992. t2 = System.currentTimeMillis();
  4993. System.out.println("t2 - t1=" + (t2 - t1));
  4994. // TreeNode root = new TreeNode(146);
  4995. // root.left = new TreeNode(71);
  4996. // root.left.left = new TreeNode(55);
  4997. // root.left.left.left = new TreeNode(321);
  4998. // root.left.left.left.left = new TreeNode(-33);
  4999. //
  5000. // root.right = new TreeNode(-13);
  5001. // root.right.left = new TreeNode(231);
  5002. // root.right.right = new TreeNode(399);
  5003. // TreeNode root = new TreeNode(1);
  5004. // root.left = new TreeNode(3);
  5005. // root.left.left = new TreeNode(2);
  5006. // root.left.left.left = new TreeNode(4);
  5007. TreeNode root = new TreeNode(0);
  5008. root.left = new TreeNode(1);
  5009. recoverTree(root);
  5010. System.out.println("Test buildTree");
  5011. // int[] preorder = {-77,24,-74,84,93,28,83,6,95,58,59,66,22,-3,-66,-68,-22,3,-80,-79,-85,17,32,9,-88,-99,14,-60,13,-93,-63,91,82,21,26,-11,-32,-16,-100,-94,-31,-62,-89,49,-9,-8,87,-33,-81,80,0,69,-7,52,67,-5,-65,31,-30,37,-57,27,23,38,-28,7,-82,-42,11,-55,-36,-58,-24,89,56,73,41,18,-87,-70,4,-64,20,-52,-39,79,19,30,65,25,-71,-76,-1,62,-69,98,39,-25,-73,70,88,-17,-20,-75,55,34,57,81,-10,94,48,-35,5,-23,-44,40,-51,-61,-13,-86,63,71,-97,45,43,51,75,33,-34,92,47,-78,85,-26,97,-29,-92,-83,-59,74,96,68,77,16,-4,10,60,64,-21,-2,1,-91,86,46,76,-37,-19,-96,36,-98,29,-72,61,50,15,-95,-40,-43,-53,90,-15,-48,-27,-90,-54,72,-50,-49,-18,78,54,35,-38,99,44,-67,53,-12,-41,2,8,-14,-84,-56,-6,12,-45,42,-47,-46};
  5012. // int[] inorder = {93,28,84,83,-74,59,58,66,-66,-3,-79,-80,3,-22,-68,22,-85,-99,14,-88,9,32,17,-60,95,-93,82,21,91,-63,26,13,-16,-32,-11,-100,6,-62,49,-89,-31,87,-8,69,0,80,-7,-81,-65,-5,67,-30,31,52,-33,37,-57,-9,7,-28,-42,-82,38,-55,11,23,-36,27,56,89,73,-24,41,-58,-70,-87,20,-64,-52,4,18,-94,19,30,-76,-1,-71,62,-69,25,-73,-25,70,39,88,98,-20,-17,65,55,-75,79,34,-39,48,94,-23,5,-44,-35,40,-10,-61,-51,-13,81,63,-97,71,-86,57,45,24,-34,85,97,-26,-78,-83,-92,74,-59,96,-29,68,47,77,92,10,-4,16,60,33,-21,1,86,76,46,-37,-91,-2,64,75,51,-19,-96,43,-98,29,61,-72,50,36,-95,-40,-43,15,90,-15,-53,-77,-54,-90,-49,-50,72,-27,35,54,-38,78,-67,44,53,99,-41,-12,-18,8,2,-48,-56,-84,-14,-45,12,42,-6,-46,-47};
  5013. int[] preorder = {1, 2};
  5014. int[] inorder = {2, 1};
  5015. TreeNode root1 = buildTree1(preorder, inorder);
  5016. System.out.println("Test numDistinct");
  5017. String S3 = "rabbbit";
  5018. String T3 = "rabbit";
  5019. S3 = "daacaedaceacabbaabdccdaaeaebacddadcaeaacadbceaecddecdeedcebcdacdaebccdeebcbdeaccabcecbeeaadbccbaeccbbdaeadecabbbedceaddcdeabbcdaeadcddedddcececbeeabcbecaeadddeddccbdbcdcbceabcacddbbcedebbcaccac";
  5020. T3 = "ceadbaa";
  5021. t1 = System.currentTimeMillis();
  5022. System.out.println(numDistinct(S3, T3));
  5023. t2 = System.currentTimeMillis();
  5024. System.out.println("t2 - t1 = " + (t2 - t1));
  5025. System.out.println("End");
  5026. }
  5027. }