baqu2213 commited on
Commit
1cb5f09
โ€ข
1 Parent(s): d8437ac

Upload 3 files

Browse files
Danbooru Prompt Selector/TEST2024/prompt_selector_auto_1212_testv8.exe CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:ec11bfc022ca130675f6d48b84f96df70e597d818158832c1d5b4d6abaa01258
3
- size 150977932
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b8ab112de60fa7d57f42c61a5ecea0dcd94df21dcd30e27c016bdfe98e389a01
3
+ size 150997702
Danbooru Prompt Selector/TEST2024/prompt_selector_auto_1212_testv8.py CHANGED
@@ -27,15 +27,18 @@ from IPython.display import display
27
  import win32clipboard
28
  from io import BytesIO
29
  from datetime import datetime
30
- import arti_list, tagbag, wlist, copyright_list_reformatted, remove_result_e
31
  import character_dictionary as cd
32
  import pandas as pd
33
  import webbrowser
 
34
 
35
  BASE_URL="https://api.novelai.net"
36
  copyright_keys = copyright_list_reformatted.copyright_list
37
  character_keys = list(cd.character_dictionary.keys())
38
  nsfw_word = list(remove_result_e.keyword_counts.keys())
 
 
39
 
40
  def argon_hash(email: str, password: str, size: int, domain: str) -> str:
41
  pre_salt = f"{password[:6]}{email}{domain}"
@@ -80,6 +83,37 @@ def generate_image(access_token, prompt, model, action, parameters):
80
  # catch any errors
81
  return response.content
82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  def generate(width, height, positive, negative, button):
84
  global temp_clipboard_image
85
  global current_sampler
@@ -180,6 +214,7 @@ def generate(width, height, positive, negative, button):
180
  image_label.original_image = i.copy()
181
  image_label.image = tk_image # ์ฐธ์กฐ ์œ ์ง€
182
  output_file_path = "output_image.jpg"
 
183
  i.save(output_file_path)
184
  error_count = 0
185
  except Exception as e:
@@ -294,9 +329,32 @@ def reset():
294
  entry_deep_search.delete(0, tk.END)
295
  text_output.delete('1.0', tk.END)
296
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
297
  def random_function():
298
  global last_deep_search_keywords, cached_rows, last_selected_row_keywords, top_100_keywords, previous_artist, top_100_counts
299
  global current_wildcard_character, current_wildcard_artist
 
300
  current_deep_search_keywords = entry_deep_search.get().strip()
301
  auto_hide_keywords = entry_auto_hide.get().split(',')
302
  auto_hide_keywords = [keyword.strip() for keyword in auto_hide_keywords if keyword.strip()]
@@ -436,10 +494,24 @@ def random_function():
436
  #if random_row_keywords[0]=='': random_row_keywords = last_selected_row_keywords
437
  text_output.delete('1.0', tk.END)
438
  else:
439
- random_index = random.randint(0, len(cached_rows) - 1)
440
- random_row = cached_rows.pop(random_index)
441
- random_row_keywords = [keyword.strip() for keyword in random_row[0].split(',')]
442
- last_selected_row_keywords = random_row_keywords.copy()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
443
 
444
  if(entry_fixed_prompt.get()):
445
  entry_text_keywords = entry_fixed_prompt.get()
@@ -472,7 +544,6 @@ def random_function():
472
  if kw in random_row_keywords:
473
  random_row_keywords.remove(kw)
474
 
475
- global previous_wildcard_artist, previous_wildcard_character, character_keys, copyright_keys
476
  # temp_first_keywords์— boy์™€ girl ํ‚ค์›Œ๋“œ๋ฅผ ์ ์ ˆํ•œ ์œ„์น˜์— ์ถ”๊ฐ€
477
  if(girl_keywords and 'girl' in temp_first_keywords[0]): temp_first_keywords.pop(0)
478
  #print(wildcard_var.get())
@@ -537,10 +608,10 @@ def random_function():
537
  if NSFW_assert_var.get():
538
  for keyword in random_row_keywords:
539
  if not rm_characteristic_var.get():
540
- if keyword not in nsfw_word and (keyword not in bag_of_tags and keyword not in character_keys and "(" not in keyword and "horns" not in keyword):
541
  nsfw_temp.append(keyword)
542
  else:
543
- if keyword not in nsfw_word:
544
  nsfw_temp.append(keyword)
545
  if nsfw_temp is not None:
546
  if not remove_artist_var.get():
@@ -569,6 +640,12 @@ def random_function():
569
  temp_first_keywords.append(keyword)
570
  random_row_keywords.remove(keyword)
571
 
 
 
 
 
 
 
572
  #last_selected_row_keywords =boy_keywords + girl_keywords[:0] + random_row_keywords
573
  #print("3 :", temp_first_keywords)
574
  if random_artist_var.get():
@@ -583,11 +660,14 @@ def random_function():
583
  #elif toggle_prompt_var.get(): random_row_keywords = temp_first_keywords + random_row_keywords
584
  else: random_row_keywords = temp_first_keywords + random_row_keywords
585
 
586
- patterns = [r'\b{}\b'.format(re.escape(keyword)) for keyword in auto_hide_keywords]
 
587
 
588
  for pattern in patterns:
589
- random_row_keywords = [re.sub(pattern + '(, )?', '', keyword) for keyword in random_row_keywords]
590
- random_row_keywords = [re.sub('(?<=, )' + pattern, '', keyword) for keyword in random_row_keywords]
 
 
591
 
592
  if entry_fixed_prompt_after.get():
593
  entry_after_text = entry_fixed_prompt_after.get().strip().split(',')
@@ -595,9 +675,6 @@ def random_function():
595
  if at_kw not in random_row_keywords and ' '+at_kw not in random_row_keywords:
596
  random_row_keywords.append(at_kw)
597
 
598
- random_row_keywords = [keyword.strip(', ') for keyword in random_row_keywords]
599
- random_row_keywords = [keyword for keyword in random_row_keywords if keyword]
600
-
601
  rm_copyright = []
602
  if(rm_copyright_var.get()):
603
  for keyword in random_row_keywords:
@@ -643,6 +720,7 @@ def random_function():
643
  random_row_keywords.remove(keyword)
644
  random_row_keywords.insert(found_index,"artist:"+keyword)
645
 
 
646
  #print(random_row_keywords)
647
  text_output.insert(tk.END, f"{', '.join(random_row_keywords)}")
648
  if auto_copy_var.get():
@@ -652,6 +730,8 @@ def random_function():
652
 
653
  cached_rows_count_label.config(text=f"์‹ฌ์ธต๊ฒ€์ƒ‰ ํ”„๋กฌํ”„ํŠธ ํ–‰: {len(cached_rows)}")
654
 
 
 
655
  def add_low_frequency_keywords():
656
  global keyword_counts, most_common_count
657
  keyword_counts = analyze_cached_rows(cached_rows)
@@ -1465,6 +1545,7 @@ def generate_turbo(_seed, turbo_count, tb_access_token,width, height, positive,
1465
  image_label.config(image=tk_image)
1466
  image_label.original_image = i.copy()
1467
  image_label.image = tk_image # ์ฐธ์กฐ ์œ ์ง€
 
1468
  if all(img is not None for img in image_queue):
1469
  time.sleep(5)
1470
  merged_image = merge_images(image_queue)
@@ -2225,6 +2306,7 @@ multi_token_enable = False
2225
  whitelist = wlist.whitelist
2226
  bag_of_tags = tagbag.bag_of_tags
2227
  afilter_30000 = arti_list.afilter_30000
 
2228
 
2229
  current_wildcard_artist = []
2230
  current_wildcard_character = []
@@ -2318,9 +2400,14 @@ button_random = tk.Button(button_frame, text="๋žœ๋ค", command=random_function)
2318
  button_random.grid(row=0, column=0, sticky='ew')
2319
 
2320
  # "ํ”„๋กฌํ”„ํŠธ ๊ณ ์ •" ํ† ๊ธ€ ๋ฒ„ํŠผ
 
 
2321
  toggle_prompt_var = tk.IntVar()
2322
- button_toggle_prompt = tk.Checkbutton(button_frame, text="ํ”„๋กฌํ”„ํŠธ ๊ณ ์ •", variable=toggle_prompt_var)
2323
- button_toggle_prompt.grid(row=0, column=1, sticky='ew')
 
 
 
2324
 
2325
  # "์ž๋™ ๋ณต์‚ฌ" ์ฒดํฌ๋ฐ•์Šค
2326
  auto_copy_var = tk.IntVar()
@@ -2577,6 +2664,9 @@ btn_add_low_freq.grid(row=0, column=3, padx=5, pady=5, sticky='ew')
2577
  show_fullscreen_btn = tk.Button(right_frame_area16, text="์ „์ฒดํ™”๋ฉด ๋ณด๊ธฐ (ESC๋กœ ๋‹ซ๊ธฐ)", command=show_fullscreen_image)
2578
  show_fullscreen_btn.grid(row=0, column=4, padx=5, pady=5, sticky='ew')
2579
 
 
 
 
2580
  # ํ•˜์–€์ƒ‰ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
2581
  white_image = Image.new('RGB', (_size, _size), 'white')
2582
  white_photo = ImageTk.PhotoImage(white_image)
 
27
  import win32clipboard
28
  from io import BytesIO
29
  from datetime import datetime
30
+ import arti_list, tagbag, wlist, copyright_list_reformatted, remove_result_e, remove_result_qe
31
  import character_dictionary as cd
32
  import pandas as pd
33
  import webbrowser
34
+ from collections import OrderedDict
35
 
36
  BASE_URL="https://api.novelai.net"
37
  copyright_keys = copyright_list_reformatted.copyright_list
38
  character_keys = list(cd.character_dictionary.keys())
39
  nsfw_word = list(remove_result_e.keyword_counts.keys())
40
+ questionable_word = list(remove_result_qe.keyword_counts.keys())
41
+ qe_word = nsfw_word + questionable_word
42
 
43
  def argon_hash(email: str, password: str, size: int, domain: str) -> str:
44
  pre_salt = f"{password[:6]}{email}{domain}"
 
83
  # catch any errors
84
  return response.content
85
 
86
+ def history_queue(image, prompt, seed):
87
+ global history
88
+ history.append([image, prompt, seed])
89
+ if len(history) > 5:
90
+ history.pop(0)
91
+
92
+ def show_history():
93
+ global history
94
+
95
+ # ์ƒˆ๋กœ์šด toplevel ์ฐฝ ์ƒ์„ฑ
96
+ history_window = tk.Toplevel(window)
97
+ history_window.title("History")
98
+
99
+ # history_window์—์„œ ์ธ๋„ค์ผ๊ณผ ํ…์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•  grid ์„ค์ •
100
+ for index, (image, prompt, seed) in enumerate(history):
101
+ # ์ด๋ฏธ์ง€๋ฅผ ์ธ๋„ค์ผ๋กœ ๋ณ€ํ™˜
102
+ image.thumbnail((192, 192)) # ๊ฐ€๋กœ ์„ธ๋กœ 100ํ”ฝ์…€๋กœ ์กฐ์ •
103
+ photo = ImageTk.PhotoImage(image)
104
+
105
+ # ์ธ๋„ค์ผ ์ด๋ฏธ์ง€ ๋ผ๋ฒจ ์ƒ์„ฑ
106
+ image_label = tk.Label(history_window, image=photo)
107
+ image_label.image = photo # ์ฐธ์กฐ๋ฅผ ์œ ์ง€
108
+ image_label.grid(row=index, column=0)
109
+
110
+ # prompt์™€ seed๋ฅผ ๊ฒฐํ•ฉํ•œ ํ…์ŠคํŠธ ์ƒ์„ฑ
111
+ text_prompt = prompt + ' Seed: ' + str(seed)
112
+ text_widget = tk.Text(history_window, height=10, width=75) # UI ์‚ฌ์ด์ฆˆ์— ๋งž๊ฒŒ width์™€ height ์กฐ์ ˆ
113
+ text_widget.insert('1.0', text_prompt)
114
+ text_widget.grid(row=index, column=1)
115
+ text_widget.config(state='disabled') # ํ…์ŠคํŠธ ์œ„์ ฏ์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์„ค์ •
116
+
117
  def generate(width, height, positive, negative, button):
118
  global temp_clipboard_image
119
  global current_sampler
 
214
  image_label.original_image = i.copy()
215
  image_label.image = tk_image # ์ฐธ์กฐ ์œ ์ง€
216
  output_file_path = "output_image.jpg"
217
+ history_queue(i_resized.copy(), positive, params['seed'])
218
  i.save(output_file_path)
219
  error_count = 0
220
  except Exception as e:
 
329
  entry_deep_search.delete(0, tk.END)
330
  text_output.delete('1.0', tk.END)
331
 
332
+ def rearrange_keywords_boys_girls(keywords):
333
+ boy_keyword = None
334
+ girl_keyword = None
335
+
336
+ # ์ฒ˜์Œ 10๊ฐœ ํ‚ค์›Œ๋“œ๋ฅผ ํ™•์ธ
337
+ for keyword in keywords[:10]:
338
+ if 'boy' in keyword and len(keyword) <= 5:
339
+ boy_keyword = keyword
340
+ if 'girl' in keyword and len(keyword) <= 5:
341
+ girl_keyword = keyword
342
+
343
+ # 'boy'์™€ 'girl' ํ‚ค์›Œ๋“œ๊ฐ€ ์กด์žฌํ•˜๊ณ , ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ
344
+ if boy_keyword and girl_keyword:
345
+ boy_index = keywords.index(boy_keyword)
346
+ if boy_index != 0:
347
+ keywords.insert(0, keywords.pop(boy_index))
348
+ girl_index = keywords.index(girl_keyword)
349
+ if girl_index > boy_index:
350
+ keywords.insert(boy_index + 1, keywords.pop(girl_index))
351
+
352
+ return keywords
353
+
354
  def random_function():
355
  global last_deep_search_keywords, cached_rows, last_selected_row_keywords, top_100_keywords, previous_artist, top_100_counts
356
  global current_wildcard_character, current_wildcard_artist
357
+ global previous_wildcard_artist, previous_wildcard_character, character_keys, copyright_keys
358
  current_deep_search_keywords = entry_deep_search.get().strip()
359
  auto_hide_keywords = entry_auto_hide.get().split(',')
360
  auto_hide_keywords = [keyword.strip() for keyword in auto_hide_keywords if keyword.strip()]
 
494
  #if random_row_keywords[0]=='': random_row_keywords = last_selected_row_keywords
495
  text_output.delete('1.0', tk.END)
496
  else:
497
+ if (safe_search_var.get()):
498
+ for i in range(100):
499
+ random_index = random.randint(0, len(cached_rows) - 1)
500
+ random_row = cached_rows.pop(random_index)
501
+ random_row_keywords = [keyword.strip() for keyword in random_row[0].split(',')]
502
+ # random_row_keywords์— qe_word ํ•ด๋‹นํ•˜๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธ
503
+ if not any(keyword in nsfw_word for keyword in random_row_keywords):
504
+ break # nsfw_word์— ํ•ด๋‹นํ•˜๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ
505
+ if len(cached_rows) == 0:
506
+ random_row_keywords = [keyword.strip() for keyword in "1girl, blank eyes, cell phone, chibi, crying, crying with eyes open, gloom (expression), holding, holding phone, open mouth, phone, smartphone, solo, surprised, tears, turn pale, white background, simple background, Search fail (text)".split(',')]
507
+ break
508
+ if i == 99: random_row_keywords = random_row_keywords = [keyword.strip() for keyword in "1girl, blank eyes, cell phone, chibi, crying, crying with eyes open, gloom (expression), holding, holding phone, open mouth, phone, smartphone, solo, surprised, tears, turn pale, white background, simple background, Search fail (text)".split(',')]
509
+ last_selected_row_keywords = random_row_keywords.copy()
510
+ else:
511
+ random_index = random.randint(0, len(cached_rows) - 1)
512
+ random_row = cached_rows.pop(random_index)
513
+ random_row_keywords = [keyword.strip() for keyword in random_row[0].split(',')]
514
+ last_selected_row_keywords = random_row_keywords.copy()
515
 
516
  if(entry_fixed_prompt.get()):
517
  entry_text_keywords = entry_fixed_prompt.get()
 
544
  if kw in random_row_keywords:
545
  random_row_keywords.remove(kw)
546
 
 
547
  # temp_first_keywords์— boy์™€ girl ํ‚ค์›Œ๋“œ๋ฅผ ์ ์ ˆํ•œ ์œ„์น˜์— ์ถ”๊ฐ€
548
  if(girl_keywords and 'girl' in temp_first_keywords[0]): temp_first_keywords.pop(0)
549
  #print(wildcard_var.get())
 
608
  if NSFW_assert_var.get():
609
  for keyword in random_row_keywords:
610
  if not rm_characteristic_var.get():
611
+ if keyword not in qe_word and (keyword not in bag_of_tags and keyword not in character_keys and "(" not in keyword and "horns" not in keyword):
612
  nsfw_temp.append(keyword)
613
  else:
614
+ if keyword not in qe_word:
615
  nsfw_temp.append(keyword)
616
  if nsfw_temp is not None:
617
  if not remove_artist_var.get():
 
640
  temp_first_keywords.append(keyword)
641
  random_row_keywords.remove(keyword)
642
 
643
+ t_temp = []
644
+ for keyword in temp_first_keywords:
645
+ t_temp.append(keyword.strip())
646
+ t_temp = list(OrderedDict.fromkeys(t_temp))
647
+ temp_first_keywords = list(t_temp)
648
+
649
  #last_selected_row_keywords =boy_keywords + girl_keywords[:0] + random_row_keywords
650
  #print("3 :", temp_first_keywords)
651
  if random_artist_var.get():
 
660
  #elif toggle_prompt_var.get(): random_row_keywords = temp_first_keywords + random_row_keywords
661
  else: random_row_keywords = temp_first_keywords + random_row_keywords
662
 
663
+ patterns = auto_hide_keywords
664
+ rm_reserved = []
665
 
666
  for pattern in patterns:
667
+ if pattern in random_row_keywords:
668
+ rm_reserved.append(pattern)
669
+ for pattern in rm_reserved:
670
+ random_row_keywords.remove(pattern)
671
 
672
  if entry_fixed_prompt_after.get():
673
  entry_after_text = entry_fixed_prompt_after.get().strip().split(',')
 
675
  if at_kw not in random_row_keywords and ' '+at_kw not in random_row_keywords:
676
  random_row_keywords.append(at_kw)
677
 
 
 
 
678
  rm_copyright = []
679
  if(rm_copyright_var.get()):
680
  for keyword in random_row_keywords:
 
720
  random_row_keywords.remove(keyword)
721
  random_row_keywords.insert(found_index,"artist:"+keyword)
722
 
723
+ random_row_keywords = rearrange_keywords_boys_girls(random_row_keywords)
724
  #print(random_row_keywords)
725
  text_output.insert(tk.END, f"{', '.join(random_row_keywords)}")
726
  if auto_copy_var.get():
 
730
 
731
  cached_rows_count_label.config(text=f"์‹ฌ์ธต๊ฒ€์ƒ‰ ํ”„๋กฌํ”„ํŠธ ํ–‰: {len(cached_rows)}")
732
 
733
+
734
+
735
  def add_low_frequency_keywords():
736
  global keyword_counts, most_common_count
737
  keyword_counts = analyze_cached_rows(cached_rows)
 
1545
  image_label.config(image=tk_image)
1546
  image_label.original_image = i.copy()
1547
  image_label.image = tk_image # ์ฐธ์กฐ ์œ ์ง€
1548
+ history_queue(i_resized.copy(), positive, params['seed'])
1549
  if all(img is not None for img in image_queue):
1550
  time.sleep(5)
1551
  merged_image = merge_images(image_queue)
 
2306
  whitelist = wlist.whitelist
2307
  bag_of_tags = tagbag.bag_of_tags
2308
  afilter_30000 = arti_list.afilter_30000
2309
+ history = []
2310
 
2311
  current_wildcard_artist = []
2312
  current_wildcard_character = []
 
2400
  button_random.grid(row=0, column=0, sticky='ew')
2401
 
2402
  # "ํ”„๋กฌํ”„ํŠธ ๊ณ ์ •" ํ† ๊ธ€ ๋ฒ„ํŠผ
2403
+ button_frame_frame = tk.Frame(button_frame)
2404
+ button_frame_frame.grid(row=0, column=1, sticky='ew')
2405
  toggle_prompt_var = tk.IntVar()
2406
+ button_toggle_prompt = tk.Checkbutton(button_frame_frame, text="ํ”„๋กฌํ”„ํŠธ ๊ณ ์ •", variable=toggle_prompt_var)
2407
+ button_toggle_prompt.grid(row=0, column=0, sticky='ew')
2408
+ safe_search_var = tk.IntVar()
2409
+ button_toggle_safe_search = tk.Checkbutton(button_frame_frame, text="์„ธ์ดํ”„์„œ์น˜", variable=safe_search_var)
2410
+ button_toggle_safe_search.grid(row=1, column=0, sticky='ew')
2411
 
2412
  # "์ž๋™ ๋ณต์‚ฌ" ์ฒดํฌ๋ฐ•์Šค
2413
  auto_copy_var = tk.IntVar()
 
2664
  show_fullscreen_btn = tk.Button(right_frame_area16, text="์ „์ฒดํ™”๋ฉด ๋ณด๊ธฐ (ESC๋กœ ๋‹ซ๊ธฐ)", command=show_fullscreen_image)
2665
  show_fullscreen_btn.grid(row=0, column=4, padx=5, pady=5, sticky='ew')
2666
 
2667
+ show_history_btn = tk.Button(right_frame_area16, text="history", command=show_history)
2668
+ show_history_btn.grid(row=0, column=5, padx=5, pady=5, sticky='ew')
2669
+
2670
  # ํ•˜์–€์ƒ‰ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
2671
  white_image = Image.new('RGB', (_size, _size), 'white')
2672
  white_photo = ImageTk.PhotoImage(white_image)
Danbooru Prompt Selector/TEST2024/remove_result_qe.py ADDED
@@ -0,0 +1 @@
 
 
1
+ keyword_counts = {'adjusting swimsuit': 525, 'hair over one breast': 433, 'heart-shaped boob challenge': 426, 'mtu virus': 361, 'male swimwear challenge': 335, 'wardrobe error': 319, 'food on breasts': 318, 'exploding clothes': 309, 'upshirt': 300, 'underbutt': 299, 'backwards virgin killer sweater': 256, 'covering ass': 239, 'adjusting panties': 232, 'bursting ass': 222, 'washing hair': 214, 'oppai challenge': 209, 'open-chest sweater': 208, 'plaid bikini': 204, 'one finger selfie challenge (meme)': 202, 'accidental pervert': 198, 'yamakasa': 198, 'c-string': 198, 'black pasties': 196, 'panties under shorts': 189, "i've never seen a guy recreate this successfully tbh (meme)": 182, 'iced latte with breast milk (meme)': 181, 'bikini tug': 178, 'x-ray vision': 177, 'pants lift': 176, 'ofuda on nipples': 175, 'popped button': 172, 'loose bikini': 171, 'back-print panties': 169, 'low neckline': 163, 'pov across bed': 162, 'floating breasts': 161, 'covering chest': 157, 'bulge lift': 157, 'removing bra': 155, 'wet skirt': 152, 'tight dress': 152, 'pantyhose under swimsuit': 151, 'bubble bath': 147, 'holding sponge': 143, 'clothes theft': 142, 'food between breasts': 139, 'whale tail (clothing)': 139, 'adjusting legwear': 137, 'strapless one-piece swimsuit': 137, 'strap break': 135, 'breast awe': 134, 'extended downblouse': 133, 'carried breast rest': 133, 'leotard peek': 133, 'two-tone panties': 131, 'breasts on tray': 130, 'bust measuring': 129, 'black slingshot swimsuit': 129, 'lifted by tail': 127, 'taut swimsuit': 127, 'x-ray glasses': 127, 'breasts day': 126, 'daijoubu? oppai momu? (meme)': 125, 'cleavage reach': 124, 'multiple hat bows': 123, 'naked suspenders': 122, 'lowleg pants': 122, 'adjusting leotard': 122, 'bunny day': 122, 'front-print panties': 121, 'flying button': 121, 'skinny dipping': 116, 'armpit focus': 116, 'ribbon between breasts': 112, 'head on ass': 111, 'shell bikini': 110, 'object on breast': 110, 'slipper bathtub': 109, 'bikini in mouth': 109, 'blood on breasts': 108, 'swim cap': 108, 'simulated footjob': 107, 'navel focus': 107, 'towel on legs': 106, 'multiple straps': 105, 'hair over crotch': 104, 'white male swimwear': 104, 'modeling': 103, 'breast contest': 103, 'multi-strapped bikini top': 102, 'ribbon bra': 102, 'print swimsuit': 101, 'urine meter': 101, 'ribbon-trimmed panties': 100, 'applying sunscreen': 100, 'fur-trimmed bikini': 98, 'simulated paizuri': 98, 'blue slingshot swimsuit': 98, 'yellow one-piece swimsuit': 98, 'side-tie peek': 98, 'breast curtain lift': 98, 'skirt caught on object': 97, 'vertical-striped bikini': 97, 'alternate body size': 97, 'washing another': 97, 'pink babydoll': 96, 'satin bra': 96, 'multicolored leotard': 96, 'shampoo': 94, 'backless swimsuit': 94, 'red male swimwear': 94, 'bamboo fence': 92, 'bed invitation': 91, 'string pull': 91, 'lowleg shorts': 91, 'ribbon-trimmed bra': 91, 'nude modeling': 90, 'silver bikini': 90, 'see-through camisole': 90, 'striped one-piece swimsuit': 89, 'mixed-sex combat': 88, 'fur bikini': 88, 'sofmap background': 88, 'yuzu (fruit)': 87, 'adjusting bra': 87, 'undone neckerchief': 87, 'inconvenient breasts': 87, 'eyewear view': 87, 'shower curtain': 86, 'washing back': 86, 'boyshort panties': 86, 'side-tie swimsuit': 86, 'shirt cut meme': 86, 'self-harm': 85, 'evo grim': 85, 'yuzu bath': 83, 'strip game': 83, 'heattech leotard': 83, 'wet legwear': 82, 'loose thighhigh': 82, 'implied tail plug': 82, 'cat panties': 82, 'multicolored panties': 82, 'clothes between thighs': 81, 'winged heart': 81, 'oppai mochi': 80, 'over the nose gag': 80, 'spread cleavage': 80, 'latex panties': 80, 'aroused nosebleed': 80, 'convenient head': 79, 'naked cardigan': 79, 'holding skirt': 78, 'see-through sports bra': 78, 'side-tie bottom': 78, 'chocolate on pussy': 77, 'naked raincoat': 76, 'adjusting buruma': 76, 'snake earrings': 76, 'rabbit panties': 75, 'undersized breast cup': 75, 'changing clothes': 74, 'clothed bath': 74, 'wing censor': 74, 'volleyball net': 74, 'brown male underwear': 74, 'lace legwear': 73, 'panties day': 73, 'removing pasties': 73, 'catfight': 73, 'licking navel': 72, 'head under skirt': 72, 'panties under bike shorts': 72, 'cunnilingus gesture': 72, 'torn kimono': 72, 'crotch focus': 72, 'virgin destroyer sweater': 72, 'underwear writing': 71, 'single sandal': 71, 'ass worship': 71, 'leaf bikini': 70, 'holding beachball': 70, 'licking stomach': 69, 'twister': 69, 'head arms': 69, 'bearhug': 68, 'spider tattoo': 68, 'self wedgie': 68, "covering another's breasts": 68, 'bikini day': 68, 'looking at bulge': 68, 'argyle cutout': 67, 'cutout above navel': 67, 'fanning crotch': 67, 'spilled milk': 67, 'shirt slip': 67, 'bound toes': 67, 'mummification (bound)': 67, 'yoga mat': 67, 'undone bikini': 67, 'impossible sweater': 66, 'yoga': 66, 'breast pillow': 66, 'finger to tongue': 66, 'arrancar': 66, 'lane line': 66, 'frilled babydoll': 66, 'striker unit': 65, 'diagonal-striped neckwear': 65, 'ke-ta (style)': 64, 'belt skirt': 64, 'sweater tug': 64, 'asymmetrical breasts': 64, 'sideless kimono': 64, 'silver footwear': 64, 'halter leotard': 64, 'meka (overwatch)': 63, 'alraune': 63, 'water censor': 63, 'torso': 63, 'areola measuring': 63, 'chloroform': 63, 'ryuko redraw (meme)': 63, 'banana boat': 62, 'towel on one shoulder': 62, 'removing legwear': 62, 'purple slingshot swimsuit': 62, 'lifting covers': 62, 'satin underwear': 62, 'cutesexyrobutts (style)': 62, 'moe2021': 62, 'wrist straps': 61, 'stomach punch': 61, 'open towel': 61, 'necktie in mouth': 61, 'aoshidan school uniform': 61, 'gimp mask': 60, 'red slingshot swimsuit': 60, 'bralines': 60, 'veiny thighs': 60, 'submission hold': 59, 'fur-trimmed leotard': 59, 'christmas tree hair ornament': 59, 'edging underwear': 59, 'gris swimsuit': 59, 'print leotard': 58, 'breast strap': 58, 'see-through bikini': 58, 'scattered hair': 57, 'naked belt': 57, 'face in crotch': 57, 'extended upskirt': 57, 'over the mouth gag': 57, 'zipper panties': 57, 'colored stripes': 56, 'body jewelry': 56, 'swimsuit tug': 56, 'swimsuit theft': 55, 'green buruma': 55, 'latex dress': 55, 'red fundoshi': 55, 'black fundoshi': 55, 'presenting breasts': 55, 'log pose': 54, 'fortified suit': 54, 'jacket over swimsuit': 54, 'boxing ring': 54, 'white slingshot swimsuit': 54, 'petal censor': 54, 'keyhole panties': 54, 'penis out of frame': 54, 'wash cloth': 53, 'gantz suit': 53, 'striped pillow': 53, "covering another's crotch": 53, 'side-tie dress': 53, 'blue babydoll': 53, 'chocolate on legs': 53, 'gimp suit': 52, 'purple sports bra': 52, 'apron pull': 52, 'bar soap': 52, 'bikini shorts': 52, 'unworn armor': 52, 'striped camisole': 52, 'kaleidostick': 52, 'smelling armpit': 52, 'shuriken hair ornament': 52, 'bust chart': 51, 'impossible towel': 51, 'polka dot swimsuit': 51, 'shiny pantyhose': 51, 'purple rope': 51, 'heart ring top': 51, 'see-through bodysuit': 51, 'torn boots': 51, 'fundoshi pull': 51, 'encasement': 51, 'kamui (kill la kill)': 51, 'inside creature': 51, 'toe-point': 51, 'imminent breast grab': 51, 'blue innertube': 51, 'asanagi (style)': 51, 'naked costume': 51, 'ass lift': 51, 'camouflage bikini': 50, 'skirt around ankles': 50, 'forced': 50, 'toe seam': 50, 'embroidered bra': 50, 'two-tone bra': 50, 'lowleg skirt': 49, 'ribbon-trimmed gloves': 49, 'eyewear in mouth': 49, 'embroidered panties': 49, 'snake tattoo': 49, 'virtuous contract': 49, 'ofuro': 49, 'length markings': 49, 'breast sucking through clothes': 48, 'knee to chest': 48, 'bandeau lift': 48, 'nearly naked coat': 48, 'wet shorts': 48, 'ox girl': 48, 'good breasts day': 48, 'heel pop': 48, 'ohisashiburi (style)': 48, 'aestus estus': 47, 'torn sweater': 47, 'good ass day': 47, 'bike jersey': 47, 'suicide': 47, 'petrification': 47, 'lace garter belt': 47, 'cow print thighhighs': 47, 'tennis': 46, 'multicolored bra': 46, 'dress in mouth': 46, 'implied footjob': 46, 'unbuttoning': 46, 'stomach day': 46, 'emaciated': 46, 'lydian academy school uniform': 46, 'sabotaged condom': 46, 'frilled garter': 46, 'belly dancing': 46, 'cat (nyanko daisensou)': 46, 'deltoids': 46, 'face to pecs': 46, 'fig sign': 45, 'wet thighhighs': 45, 'under skirt': 45, 'shirt on shoulders': 45, 'heart bikini': 45, 'implied erection': 45, 'kittysuit': 45, 'milk churn': 45, 'print towel': 45, 'spiked thighlet': 45, 'purple camisole': 45, 'cream on breasts': 45, 'lowleg pantyhose': 44, 'lace-trimmed bikini': 44, 'karada': 44, 'holding surfboard': 44, 'extra breasts': 44, 'kickboard': 44, 'school swimsuit flap': 44, 'highleg dress': 44, 'swimsuit hanger': 44, 'double strap slip': 44, 'beach volleyball': 43, 'slim legs': 43, 'unclasped': 43, 'wiggling toes': 43, 'checkered wall': 43, 'apron tug': 43, 'flower censor': 43, 'rhythmic gymnastics': 43, 'pantsing': 43, 'chocolate covered': 43, 'no hairband': 43, 'green camisole': 43, 'bikini over clothes': 43, 'step-sisters': 43, 'starfish bikini': 43, 'covering one nipple': 43, 'sexting': 43, 'buying condoms': 43, 'black bikini bottom': 43, 'year of the monkey': 42, 'corset piercing': 42, 'chijo': 42, 'towel slip': 42, 'wringing skirt': 42, 'wrist cutting': 42, 'arena (company)': 42, 'iron blood (emblem)': 42, 'convenient hand': 42, 'pixie cut': 42, 'black nightgown': 42, 'swimsuit cover-up': 42, 'red bandeau': 42, 'bat tattoo': 42, 'peed self': 42, 'innerboob': 41, 'strawberry bra': 41, 'checkered panties': 41, 'multicolored stripes': 41, 'convenient skirt': 41, 'maid leotard': 41, 'green slingshot swimsuit': 41, 'downpants': 41, 'adult baby': 41, 'fishnet leotard': 41, 'trinity general school swimsuit': 41, 'curtain call challenge (meme)': 41, 'ryokan': 40, 'bubble filter': 40, 'towel rack': 40, 'white tiger print': 40, '3;': 40, 'grey one-piece swimsuit': 40, 'sunbathing': 40, 'colored armpit hair': 40, 'sock pull': 40, 'sailor swimsuit (idolmaster)': 40, 'skull tattoo': 40, 'white bandeau': 40, 'moomoo milk': 40, 'bent over': 40, 'torso grab': 40, 'bound': 40, 'shibari': 40, 'restrained':40}