bioroebe 0.12.24 → 0.13.31

Sign up to get free protection for your applications and to get access to all the features.
Files changed (503) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +7 -8
  3. data/README.md +566 -354
  4. data/bin/all_positions_of_this_nucleotide +1 -1
  5. data/bin/aminoacid_frequencies +1 -1
  6. data/bin/automatically_rename_this_fasta_file +1 -1
  7. data/bin/base_composition +1 -1
  8. data/bin/batch_create_windows_executables +1 -1
  9. data/bin/bioroebe +12 -1
  10. data/bin/bioroebe_cat +7 -0
  11. data/bin/calculate_exponential_growth +7 -0
  12. data/bin/calculate_n50_value +1 -1
  13. data/bin/calculate_the_frequencies_of_this_species +7 -0
  14. data/bin/chunked_display +1 -1
  15. data/bin/codon_frequency +1 -1
  16. data/bin/codon_to_aminoacid +1 -1
  17. data/bin/colourize_this_fasta_sequence +1 -1
  18. data/bin/complementary_dna_strand +1 -1
  19. data/bin/complementary_rna_strand +1 -1
  20. data/bin/consensus_sequence +1 -1
  21. data/bin/dna_to_rna +1 -1
  22. data/bin/downcase_chunked_display +1 -1
  23. data/bin/download_this_pdb +1 -1
  24. data/bin/fasta_index +1 -1
  25. data/bin/fetch_data_from_uniprot +1 -1
  26. data/bin/filter_away_invalid_nucleotides +1 -1
  27. data/bin/find_substring +1 -1
  28. data/bin/input_as_dna +1 -1
  29. data/bin/is_palindrome +1 -1
  30. data/bin/leading_five_prime +1 -1
  31. data/bin/longest_ORF +1 -1
  32. data/bin/longest_substring +1 -1
  33. data/bin/open_reading_frames +1 -1
  34. data/bin/partner_nucleotide +1 -1
  35. data/bin/plain_palindrome +1 -1
  36. data/bin/random_dna_sequence +1 -1
  37. data/bin/random_sequence +1 -1
  38. data/bin/raw_hamming_distance +1 -1
  39. data/bin/return_longest_substring_via_LCS_algorithm +1 -1
  40. data/bin/reverse_sequence +1 -1
  41. data/bin/short_aminoacid_letter_from_long_aminoacid_name +1 -1
  42. data/bin/show_atomic_composition +1 -1
  43. data/bin/show_fasta_header +1 -1
  44. data/bin/show_nucleotide_sequence +1 -1
  45. data/bin/show_this_dna_sequence +1 -1
  46. data/bin/show_time_now +7 -0
  47. data/bin/sort_aminoacid_based_on_its_hydrophobicity +1 -1
  48. data/bin/strict_filter_away_invalid_aminoacids +1 -1
  49. data/{lib/bioroebe/base/reset.rb → bin/three_delimiter} +9 -6
  50. data/bin/three_to_one +1 -1
  51. data/bin/to_rna +1 -1
  52. data/bin/trailing_three_prime +1 -1
  53. data/bin/upcase_this_aminoacid_sequence_and_remove_numbers +1 -1
  54. data/bioroebe.gemspec +6 -7
  55. data/doc/README.gen +534 -322
  56. data/doc/blosum/blosum.md +4 -0
  57. data/doc/compatibility/BIO_PHP.md +20 -18
  58. data/doc/compatibility/README.md +2 -3
  59. data/doc/compatibility/emboss.md +5 -3
  60. data/doc/{extensive_usage_example.md → extensive_usage_example/extensive_usage_example.md} +4 -2
  61. data/doc/{instructions_for_the_taxonomy_subproject.md → instructions_for_the_taxonomy_subproject/instructions_for_the_taxonomy_subproject.md} +36 -33
  62. data/doc/{legacy_paths.md → legacy_paths/legacy_paths.md} +3 -3
  63. data/doc/statistics/statistics.md +12 -10
  64. data/doc/todo/bioroebe_GUI_todo.md +6 -1
  65. data/doc/todo/bioroebe_java_todo.md +3 -2
  66. data/doc/todo/bioroebe_todo.md +328 -310
  67. data/doc/{using_biomart.md → using_biomart/using_biomart.md} +7 -3
  68. data/lib/bioroebe/abstract/features.rb +0 -0
  69. data/lib/bioroebe/aminoacids/aminoacid_substitution.rb +1 -1
  70. data/lib/bioroebe/aminoacids/aminoacids_mass_table.rb +3 -1
  71. data/lib/bioroebe/aminoacids/codon_percentage.rb +18 -10
  72. data/lib/bioroebe/aminoacids/create_random_aminoacids.rb +5 -2
  73. data/lib/bioroebe/aminoacids/deduce_aminoacid_sequence.rb +90 -64
  74. data/lib/bioroebe/aminoacids/display_aminoacid_table.rb +1 -3
  75. data/lib/bioroebe/aminoacids/show_hydrophobicity.rb +2 -2
  76. data/lib/bioroebe/annotations/create_annotation_format.rb +2 -2
  77. data/lib/bioroebe/base/base.rb +101 -6
  78. data/lib/bioroebe/base/base_module/base_module.rb +9 -1
  79. data/lib/bioroebe/base/colours.rb +3 -0
  80. data/lib/bioroebe/base/colours_for_base/colours_for_base.rb +80 -44
  81. data/lib/bioroebe/base/commandline_application/README.md +1 -1
  82. data/lib/bioroebe/base/commandline_application/commandline_application.rb +661 -22
  83. data/lib/bioroebe/base/commandline_application/commandline_arguments.rb +2 -1
  84. data/lib/bioroebe/base/infer_the_namespace_module/infer_the_namespace_module.rb +37 -0
  85. data/lib/bioroebe/base/internal_hash_module/internal_hash_module.rb +1 -6
  86. data/lib/bioroebe/base/prototype/prototype.rb +155 -14
  87. data/lib/bioroebe/biomart/attribute.rb +1 -1
  88. data/lib/bioroebe/biomart/biomart.rb +8 -9
  89. data/lib/bioroebe/biomart/server.rb +1 -1
  90. data/lib/bioroebe/blosum/blosum.rb +2 -2
  91. data/lib/bioroebe/calculate/calculate_blosum_score.rb +5 -3
  92. data/lib/bioroebe/calculate/calculate_gc_content.rb +1 -1
  93. data/lib/bioroebe/calculate/calculate_levensthein_distance.rb +5 -3
  94. data/lib/bioroebe/calculate/calculate_melting_temperature.rb +2 -10
  95. data/lib/bioroebe/calculate/calculate_melting_temperature_for_more_than_thirteen_nucleotides.rb +6 -15
  96. data/lib/bioroebe/calculate/calculate_the_position_specific_scoring_matrix.rb +4 -2
  97. data/lib/bioroebe/cell/cell.rb +3 -2
  98. data/lib/bioroebe/cell/specialized_cells/B_cell.rb +60 -0
  99. data/lib/bioroebe/cell/specialized_cells/Macrophage.rb +60 -0
  100. data/lib/bioroebe/cell/specialized_cells/README.md +5 -0
  101. data/lib/bioroebe/cell/specialized_cells/T_cell.rb +60 -0
  102. data/lib/bioroebe/cleave_and_digest/cleave.rb +3 -1
  103. data/lib/bioroebe/cleave_and_digest/digestion.rb +1 -1
  104. data/lib/bioroebe/codon_tables/frequencies/10090_Mus_musculus.yml +93 -0
  105. data/lib/bioroebe/codon_tables/frequencies/107243_Thlaspi_caerulescens.yml +72 -0
  106. data/lib/bioroebe/codon_tables/frequencies/parse_frequency_table.rb +2 -2
  107. data/lib/bioroebe/codons/codon_table.rb +10 -2
  108. data/lib/bioroebe/codons/codons.rb +3 -3
  109. data/lib/bioroebe/codons/convert_this_codon_to_that_aminoacid.rb +18 -15
  110. data/lib/bioroebe/codons/determine_optimal_codons.rb +1 -1
  111. data/lib/bioroebe/codons/possible_codons_for_this_aminoacid.rb +4 -2
  112. data/lib/bioroebe/codons/show_codon_tables.rb +1 -1
  113. data/lib/bioroebe/codons/show_codon_usage.rb +1 -2
  114. data/lib/bioroebe/codons/show_this_codon_table.rb +2 -2
  115. data/lib/bioroebe/codons/start_codons.rb +7 -3
  116. data/lib/bioroebe/colours/colour_schemes/README.md +1 -1
  117. data/lib/bioroebe/colours/colour_schemes/array_available_colour_schemes.rb +3 -3
  118. data/lib/bioroebe/colours/colour_schemes/colour_scheme.rb +3 -3
  119. data/lib/bioroebe/colours/colour_schemes/colour_scheme_demo.rb +4 -3
  120. data/lib/bioroebe/colours/colour_schemes/helix.rb +3 -1
  121. data/lib/bioroebe/colours/colour_schemes/hydropathy.rb +3 -1
  122. data/lib/bioroebe/colours/colour_schemes/score.rb +13 -2
  123. data/lib/bioroebe/colours/colour_schemes/strand.rb +3 -1
  124. data/lib/bioroebe/colours/colour_schemes/turn.rb +3 -1
  125. data/lib/bioroebe/colours/colour_schemes/zappo.rb +1 -1
  126. data/lib/bioroebe/{toplevel_methods/colourize_related_methods.rb → colours/colourize_related_code.rb} +1 -3
  127. data/lib/bioroebe/colours/colourize_sequence.rb +3 -1
  128. data/lib/bioroebe/colours/colours.rb +172 -15
  129. data/lib/bioroebe/configuration/configuration.rb +1 -1
  130. data/lib/bioroebe/constants/GUIs.rb +2 -2
  131. data/lib/bioroebe/constants/constants.rb +1349 -0
  132. data/lib/bioroebe/conversions/convert_aminoacid_to_dna.rb +8 -13
  133. data/lib/bioroebe/conversions/dna_to_aminoacid_sequence.rb +9 -3
  134. data/lib/bioroebe/count/count_amount_of_aminoacids.rb +11 -10
  135. data/lib/bioroebe/count/count_amount_of_nucleotides.rb +1 -1
  136. data/lib/bioroebe/count/count_at.rb +2 -1
  137. data/lib/bioroebe/databases/download_taxonomy_database.rb +1 -1
  138. data/lib/bioroebe/dotplots/advanced_dotplot.rb +2 -2
  139. data/lib/bioroebe/electron_microscopy/coordinate_analyzer.rb +2 -2
  140. data/lib/bioroebe/electron_microscopy/fix_pos_file.rb +2 -2
  141. data/lib/bioroebe/electron_microscopy/flipy.rb +2 -2
  142. data/lib/bioroebe/electron_microscopy/generate_em2em_file.rb +3 -11
  143. data/lib/bioroebe/electron_microscopy/parse_coordinates.rb +6 -6
  144. data/lib/bioroebe/electron_microscopy/read_file_xmd.rb +6 -6
  145. data/lib/bioroebe/electron_microscopy/simple_star_file_generator.rb +2 -2
  146. data/lib/bioroebe/enzymes/has_this_restriction_enzyme.rb +1 -1
  147. data/lib/bioroebe/enzymes/restriction_enzyme.rb +1 -1
  148. data/lib/bioroebe/enzymes/restriction_enzymes/statistics.rb +4 -3
  149. data/lib/bioroebe/enzymes/restriction_enzymes_file.rb +1 -1
  150. data/lib/bioroebe/enzymes/return_sequence_that_is_cut_via_restriction_enzyme.rb +4 -3
  151. data/lib/bioroebe/enzymes/show_restriction_enzymes.rb +3 -3
  152. data/lib/bioroebe/ext/main.cpp +0 -1
  153. data/lib/bioroebe/fasta_and_fastq/autocorrect_the_name_of_this_fasta_file.rb +3 -3
  154. data/lib/bioroebe/fasta_and_fastq/compact_fasta_file/compact_fasta_file.rb +1 -1
  155. data/lib/bioroebe/fasta_and_fastq/display_how_many_fasta_entries_are_in_this_directory.rb +1 -1
  156. data/lib/bioroebe/fasta_and_fastq/download_fasta.rb +8 -14
  157. data/lib/bioroebe/fasta_and_fastq/fasta_defline/fasta_defline.rb +1 -1
  158. data/lib/bioroebe/fasta_and_fastq/fasta_to_yaml/fasta_to_yaml.rb +1 -1
  159. data/lib/bioroebe/fasta_and_fastq/fastq_format_explainer.rb +1 -1
  160. data/lib/bioroebe/fasta_and_fastq/length_modifier/length_modifier.rb +1 -1
  161. data/lib/bioroebe/fasta_and_fastq/parse_fasta/parse_fasta.rb +37 -11
  162. data/lib/bioroebe/fasta_and_fastq/parse_fastq/parse_fastq.rb +2 -2
  163. data/lib/bioroebe/fasta_and_fastq/return_fasta_subsection_of_this_file.rb +1 -1
  164. data/lib/bioroebe/fasta_and_fastq/show_fasta_headers.rb +5 -13
  165. data/lib/bioroebe/fasta_and_fastq/show_fasta_statistics.rb +1 -1
  166. data/lib/bioroebe/fasta_and_fastq/simplify_fasta_header/simplify_fasta_header.rb +1 -1
  167. data/lib/bioroebe/fasta_and_fastq/split_this_fasta_file_into_chromosomes/reset.rb +3 -6
  168. data/lib/bioroebe/fasta_and_fastq/split_this_fasta_file_into_chromosomes/split_this_fasta_file_into_chromosomes.rb +3 -3
  169. data/lib/bioroebe/genbank/genbank_flat_file_format_generator.rb +20 -11
  170. data/lib/bioroebe/genome/genome.rb +1 -1
  171. data/lib/bioroebe/genomes/genome_pattern.rb +17 -16
  172. data/lib/bioroebe/genomes/genome_retriever.rb +4 -2
  173. data/lib/bioroebe/gui/experimental/snapgene/snapgene.rb +10 -13
  174. data/lib/bioroebe/gui/universal_widgets/alignment/alignment.rb +557 -0
  175. data/lib/bioroebe/gui/{gtk3 → universal_widgets}/aminoacid_composition/aminoacid_composition.rb +498 -198
  176. data/lib/bioroebe/gui/universal_widgets/anti_sense_strand/anti_sense_strand.rb +665 -0
  177. data/lib/bioroebe/gui/universal_widgets/blosum_matrix_viewer/blosum_matrix_viewer.rb +329 -0
  178. data/lib/bioroebe/gui/universal_widgets/calculate_cell_numbers_of_bacteria/calculate_cell_numbers_of_bacteria.rb +423 -0
  179. data/lib/bioroebe/gui/{gtk3 → universal_widgets}/controller/controller.rb +170 -118
  180. data/lib/bioroebe/gui/{gtk3 → universal_widgets}/dna_to_aminoacid_widget/dna_to_aminoacid_widget.rb +277 -215
  181. data/lib/bioroebe/gui/{shared_code/dna_to_reverse_complement_widget/dna_to_reverse_complement_widget_module.rb → universal_widgets/dna_to_reverse_complement_widget/dna_to_reverse_complement_widget.rb} +297 -107
  182. data/lib/bioroebe/gui/universal_widgets/fasta_table_widget/fasta_table_widget.rb +643 -0
  183. data/lib/bioroebe/gui/{gtk3 → universal_widgets}/format_converter/format_converter.rb +236 -164
  184. data/lib/bioroebe/gui/universal_widgets/gene/gene.rb +278 -0
  185. data/lib/bioroebe/gui/universal_widgets/hamming_distance/hamming_distance.rb +646 -0
  186. data/lib/bioroebe/gui/{shared_code/levensthein_distance/levensthein_distance_module.rb → universal_widgets/levensthein_distance/levensthein_distance.rb} +313 -88
  187. data/lib/bioroebe/gui/{gtk3 → universal_widgets}/nucleotide_analyser/nucleotide_analyser.rb +281 -189
  188. data/lib/bioroebe/gui/{gtk3 → universal_widgets}/parse_pdb_file/parse_pdb_file.rb +265 -149
  189. data/lib/bioroebe/gui/{gtk3 → universal_widgets}/primer_design_widget/primer_design_widget.rb +337 -263
  190. data/lib/bioroebe/gui/universal_widgets/protein_to_DNA/protein_to_DNA.rb +408 -0
  191. data/lib/bioroebe/gui/{gtk3 → universal_widgets}/random_sequence/random_sequence.rb +245 -187
  192. data/lib/bioroebe/gui/{gtk3 → universal_widgets}/restriction_enzymes/restriction_enzymes.rb +207 -137
  193. data/lib/bioroebe/gui/universal_widgets/shell/shell.rb +288 -0
  194. data/lib/bioroebe/gui/{gtk3/show_codon_table/misc.rb → universal_widgets/show_codon_table/show_codon_table.rb} +290 -110
  195. data/lib/bioroebe/gui/{shared_code/show_codon_usage/show_codon_usage_module.rb → universal_widgets/show_codon_usage/show_codon_usage.rb} +228 -47
  196. data/lib/bioroebe/gui/{gtk3 → universal_widgets}/sizeseq/sizeseq.rb +151 -69
  197. data/lib/bioroebe/gui/{gtk3 → universal_widgets}/three_to_one/three_to_one.rb +190 -127
  198. data/lib/bioroebe/gui/{gtk3 → universal_widgets}/www_finder/www_finder.rb +211 -152
  199. data/lib/bioroebe/images/images.html +953 -1170
  200. data/lib/bioroebe/images/misc/README.md +6 -0
  201. data/lib/bioroebe/images/misc/activation.avif +0 -0
  202. data/lib/bioroebe/images/misc/inhibition.avif +0 -0
  203. data/lib/bioroebe/images/misc/small_virus_logo.avif +0 -0
  204. data/lib/bioroebe/{constants/base_directory.rb → log_directory/log_directory.rb} +79 -59
  205. data/lib/bioroebe/matplotlib/matplotlib_generator.rb +1 -1
  206. data/lib/bioroebe/misc/quiz/three_letter_to_aminoacid.rb +1 -1
  207. data/lib/bioroebe/misc/ruler.rb +5 -5
  208. data/lib/bioroebe/misc/useful_formulas.rb +3 -3
  209. data/lib/bioroebe/ncbi/efetch.rb +1 -2
  210. data/lib/bioroebe/ngs/phred_quality_score_table.rb +3 -3
  211. data/lib/bioroebe/nucleotides/complementary_dna_strand.rb +3 -6
  212. data/lib/bioroebe/nucleotides/molecular_weight_of_nucleotides.rb +3 -3
  213. data/lib/bioroebe/nucleotides/most_likely_nucleotide_sequence_for_this_aminoacid_sequence.rb +6 -10
  214. data/lib/bioroebe/nucleotides/{show_nucleotide_sequence.rb → show_nucleotide_sequence/show_nucleotide_sequence.rb} +377 -255
  215. data/lib/bioroebe/palindromes/palindrome_2D_structure.rb +1 -1
  216. data/lib/bioroebe/palindromes/palindrome_finder.rb +1 -1
  217. data/lib/bioroebe/palindromes/palindrome_generator.rb +2 -10
  218. data/lib/bioroebe/parsers/biolang_parser.rb +1 -1
  219. data/lib/bioroebe/parsers/blosum_parser.rb +14 -19
  220. data/lib/bioroebe/parsers/genbank_parser.rb +2 -6
  221. data/lib/bioroebe/parsers/gff.rb +9 -9
  222. data/lib/bioroebe/parsers/parse_embl.rb +2 -6
  223. data/lib/bioroebe/parsers/stride_parser.rb +4 -12
  224. data/lib/bioroebe/patterns/analyse_glycosylation_pattern.rb +2 -2
  225. data/lib/bioroebe/patterns/is_this_sequence_a_EGF2_pattern.rb +6 -3
  226. data/lib/bioroebe/patterns/profile_pattern.rb +2 -2
  227. data/lib/bioroebe/patterns/rgg_scanner.rb +4 -2
  228. data/lib/bioroebe/{protein_structure → pdb_and_protein_structure}/alpha_helix.rb +2 -2
  229. data/lib/bioroebe/{pdb → pdb_and_protein_structure}/download_this_pdb.rb +2 -3
  230. data/lib/bioroebe/{pdb → pdb_and_protein_structure}/fetch_fasta_sequence_from_pdb.rb +4 -4
  231. data/lib/bioroebe/{protein_structure → pdb_and_protein_structure}/helical_wheel.rb +2 -2
  232. data/lib/bioroebe/{pdb → pdb_and_protein_structure}/parse_mmCIF_file.rb +1 -1
  233. data/lib/bioroebe/{pdb → pdb_and_protein_structure}/parse_pdb_file.rb +3 -3
  234. data/lib/bioroebe/{pdb → pdb_and_protein_structure}/report_secondary_structures_from_this_pdb_file.rb +3 -3
  235. data/lib/bioroebe/project/project.rb +3 -1
  236. data/lib/bioroebe/raw_sequence/README.md +8 -8
  237. data/lib/bioroebe/raw_sequence/raw_sequence.rb +11 -2
  238. data/lib/bioroebe/regexes/regexes.rb +1 -2
  239. data/lib/bioroebe/requires/commandline_application.rb +3 -1
  240. data/lib/bioroebe/requires/require_all_pdb_files.rb +1 -1
  241. data/lib/bioroebe/requires/require_all_taxonomy_files.rb +1 -1
  242. data/lib/bioroebe/requires/require_all_utility_scripts_files.rb +10 -0
  243. data/lib/bioroebe/requires/require_colours.rb +1 -1
  244. data/lib/bioroebe/requires/require_the_bioroebe_project.rb +5 -7
  245. data/lib/bioroebe/requires/require_the_bioroebe_sinatra_components.rb +1 -1
  246. data/lib/bioroebe/requires/require_the_constants.rb +2 -14
  247. data/lib/bioroebe/requires/require_yaml.rb +7 -5
  248. data/lib/bioroebe/sequence/alignment.rb +1 -1
  249. data/lib/bioroebe/sequence/dna.rb +4 -2
  250. data/lib/bioroebe/sequence/nucleotide_module/nucleotide_module.rb +22 -8
  251. data/lib/bioroebe/sequence/protein.rb +2 -2
  252. data/lib/bioroebe/sequence/reverse_complement.rb +3 -3
  253. data/lib/bioroebe/sequence/rna.rb +9 -8
  254. data/lib/bioroebe/sequence/sequence.rb +3 -3
  255. data/lib/bioroebe/shell/configuration/additionally_set_xorg_buffer.yml +0 -0
  256. data/lib/bioroebe/shell/configuration/may_we_show_the_startup_information.yml +0 -0
  257. data/lib/bioroebe/shell/configuration/upcase_nucleotides.yml +0 -0
  258. data/lib/bioroebe/shell/configuration/use_silent_startup.yml +1 -1
  259. data/lib/bioroebe/shell/help/class.rb +68 -19
  260. data/lib/bioroebe/shell/menu.rb +5244 -5322
  261. data/lib/bioroebe/shell/{readline/readline.rb → readline.rb} +1 -3
  262. data/lib/bioroebe/shell/shell.rb +11240 -453
  263. data/lib/bioroebe/siRNA/siRNA.rb +3 -3
  264. data/lib/bioroebe/{gui/shared_code/blosum_matrix_viewer/blosum_matrix_viewer_module.rb → sinatra/sinatra_interface.rb} +28 -19
  265. data/lib/bioroebe/{www/sinatra/sinatra.rb → sinatra/sinatra_wrapper.rb} +731 -754
  266. data/lib/bioroebe/string_matching/find_longest_substring.rb +2 -10
  267. data/lib/bioroebe/string_matching/find_longest_substring_via_LCS_algorithm.rb +4 -14
  268. data/lib/bioroebe/string_matching/hamming_distance.rb +11 -10
  269. data/lib/bioroebe/string_matching/levensthein.rb +5 -17
  270. data/lib/bioroebe/string_matching/simple_string_comparer.rb +48 -4
  271. data/lib/bioroebe/string_matching/smith_waterman.rb +11 -6
  272. data/lib/bioroebe/svg/glyph.rb +4 -1
  273. data/lib/bioroebe/svg/mini_feature.rb +1 -1
  274. data/lib/bioroebe/svg/page.rb +18 -7
  275. data/lib/bioroebe/svg/svgee.rb +22 -13
  276. data/lib/bioroebe/svg/track.rb +20 -4
  277. data/lib/bioroebe/taxonomy/chart.rb +2 -2
  278. data/lib/bioroebe/taxonomy/class_methods.rb +5 -6
  279. data/lib/bioroebe/taxonomy/constants.rb +1 -1
  280. data/lib/bioroebe/taxonomy/info/info.rb +1 -1
  281. data/lib/bioroebe/taxonomy/info/is_dna.rb +1 -1
  282. data/lib/bioroebe/taxonomy/interactive.rb +1 -2
  283. data/lib/bioroebe/taxonomy/menu.rb +1 -1
  284. data/lib/bioroebe/taxonomy/node.rb +1 -1
  285. data/lib/bioroebe/taxonomy/parse_fasta.rb +4 -2
  286. data/lib/bioroebe/taxonomy/shared.rb +5 -4
  287. data/lib/bioroebe/taxonomy/taxonomy.rb +2 -4
  288. data/lib/bioroebe/toplevel_methods/fasta_and_fastq.rb +3 -45
  289. data/lib/bioroebe/toplevel_methods/{is_on_roebe.rb → roebe.rb} +1 -11
  290. data/lib/bioroebe/toplevel_methods/taxonomy.rb +6 -12
  291. data/lib/bioroebe/toplevel_methods/toplevel_methods.rb +5568 -0
  292. data/lib/bioroebe/utility_scripts/align_open_reading_frames.rb +4 -3
  293. data/lib/bioroebe/utility_scripts/analyse_local_dataset.rb +2 -2
  294. data/lib/bioroebe/utility_scripts/check_for_mismatches/check_for_mismatches.rb +16 -9
  295. data/lib/bioroebe/utility_scripts/compacter/compacter.rb +4 -2
  296. data/lib/bioroebe/utility_scripts/compare_these_two_sequences_via_blosum.rb +119 -0
  297. data/lib/bioroebe/utility_scripts/compseq/compseq.rb +11 -9
  298. data/lib/bioroebe/utility_scripts/{consensus_sequence.rb → consensus_sequence/consensus_sequence.rb} +13 -4
  299. data/lib/bioroebe/utility_scripts/{create_batch_entrez_file.rb → create_batch_entrez_file/create_batch_entrez_file.rb} +5 -5
  300. data/lib/bioroebe/utility_scripts/{determine_antigenic_areas.rb → determine_antigenic_areas/determine_antigenic_areas.rb} +5 -5
  301. data/lib/bioroebe/utility_scripts/{determine_missing_nucleotides_percentage.rb → determine_missing_nucleotides_percentage/determine_missing_nucleotides_percentage.rb} +16 -15
  302. data/lib/bioroebe/utility_scripts/display_open_reading_frames/display_open_reading_frames.rb +7 -7
  303. data/lib/bioroebe/utility_scripts/display_open_reading_frames/misc.rb +1 -1
  304. data/lib/bioroebe/utility_scripts/display_open_reading_frames/report.rb +2 -0
  305. data/lib/bioroebe/utility_scripts/{dot_alignment.rb → dot_alignment/dot_alignment.rb} +3 -3
  306. data/lib/bioroebe/utility_scripts/{download_files_from_rebase.rb → download_files_from_rebase/download_files_from_rebase.rb} +5 -5
  307. data/lib/bioroebe/utility_scripts/fetch_data_from_uniprot/fetch_data_from_uniprot.rb +269 -0
  308. data/lib/bioroebe/utility_scripts/find_gene.rb +4 -2
  309. data/lib/bioroebe/utility_scripts/{mirror_repeat.rb → mirror_repeat/mirror_repeat.rb} +5 -5
  310. data/lib/bioroebe/utility_scripts/move_file_to_its_correct_location.rb +3 -3
  311. data/lib/bioroebe/utility_scripts/{parse_taxonomy.rb → parse_taxonomy/parse_taxonomy.rb} +15 -6
  312. data/lib/bioroebe/utility_scripts/{pathways.rb → pathways/pathways.rb} +4 -3
  313. data/lib/bioroebe/utility_scripts/{permutations.rb → permutations/permutations.rb} +3 -3
  314. data/lib/bioroebe/utility_scripts/punnet/punnet.rb +4 -2
  315. data/lib/bioroebe/utility_scripts/{show_this_dna_sequence.rb → show_this_dna_sequence/show_this_dna_sequence.rb} +1 -1
  316. data/lib/bioroebe/utility_scripts/showorf/showorf.rb +406 -10
  317. data/lib/bioroebe/version/version.rb +2 -2
  318. data/lib/bioroebe/viennarna/rnafold_wrapper.rb +5 -13
  319. data/lib/bioroebe/virus/individual_viruses/README.md +15 -0
  320. data/lib/bioroebe/virus/individual_viruses/tobacco_mosaic_virus.rb +40 -0
  321. data/lib/bioroebe/virus/virus.rb +76 -0
  322. data/lib/bioroebe/www/bioroebe.cgi +4 -3
  323. data/lib/bioroebe/www/embeddable_interface.rb +85 -49
  324. data/lib/bioroebe/yaml/agarose/agarose_concentrations.yml +6 -6
  325. data/lib/bioroebe/yaml/antisense/antisense.yml +2 -0
  326. data/lib/bioroebe/yaml/blosum/blosum50.yml +6 -0
  327. data/lib/bioroebe/yaml/blosum/blosum90.yml +2 -1
  328. data/lib/bioroebe/yaml/chromosomes/chromosome_numbers.yml +2 -2
  329. data/lib/bioroebe/yaml/configuration/temp_dir.yml +1 -1
  330. data/lib/bioroebe/yaml/consensus_sequences/consensus_sequences.yml +1 -0
  331. data/lib/bioroebe/yaml/enzymes/enzyme_classes.yml +7 -6
  332. data/lib/bioroebe/yaml/humans/human_chromosomes.yml +3 -3
  333. data/lib/bioroebe/yaml/mRNA/mRNA.yml +1 -5
  334. data/lib/bioroebe/yaml/nucleotides/abbreviations_for_nucleotides.yml +1 -0
  335. data/lib/bioroebe/yaml/nucleotides/nucleotide_density.yml +2 -1
  336. data/lib/bioroebe/yaml/promoters/35S.yml +3 -1
  337. data/lib/bioroebe/yaml/proteases/proteases.yml +3 -1
  338. data/lib/bioroebe/yaml/proteins/ubiquitin.yml +4 -1
  339. data/lib/bioroebe/yaml/restriction_enzymes/restriction_enzymes.yml +7 -7
  340. data/spec/testing_toplevel_method_editor.rb +1 -1
  341. data/spec/testing_toplevel_method_verbose.rb +1 -1
  342. data/test/testing_dna_to_rna_conversion.rb +1 -1
  343. metadata +127 -235
  344. data/doc/blosum.md +0 -5
  345. data/lib/bioroebe/base/commandline_application/aminoacids.rb +0 -33
  346. data/lib/bioroebe/base/commandline_application/directory.rb +0 -33
  347. data/lib/bioroebe/base/commandline_application/extract.rb +0 -22
  348. data/lib/bioroebe/base/commandline_application/misc.rb +0 -502
  349. data/lib/bioroebe/base/commandline_application/opn.rb +0 -47
  350. data/lib/bioroebe/base/commandline_application/reset.rb +0 -42
  351. data/lib/bioroebe/base/commandline_application/warnings.rb +0 -36
  352. data/lib/bioroebe/base/commandline_application/write_what_into.rb +0 -29
  353. data/lib/bioroebe/base/initialize.rb +0 -18
  354. data/lib/bioroebe/base/misc.rb +0 -129
  355. data/lib/bioroebe/base/namespace.rb +0 -16
  356. data/lib/bioroebe/base/prototype/e_and_ee.rb +0 -24
  357. data/lib/bioroebe/base/prototype/misc.rb +0 -114
  358. data/lib/bioroebe/base/prototype/mkdir.rb +0 -20
  359. data/lib/bioroebe/base/prototype/reset.rb +0 -36
  360. data/lib/bioroebe/colours/misc_colours.rb +0 -80
  361. data/lib/bioroebe/colours/rev.rb +0 -44
  362. data/lib/bioroebe/colours/sdir.rb +0 -21
  363. data/lib/bioroebe/colours/sfancy.rb +0 -21
  364. data/lib/bioroebe/colours/sfile.rb +0 -21
  365. data/lib/bioroebe/colours/simp.rb +0 -21
  366. data/lib/bioroebe/colours/swarn.rb +0 -29
  367. data/lib/bioroebe/constants/aminoacids_and_proteins.rb +0 -147
  368. data/lib/bioroebe/constants/carriage_return.rb +0 -14
  369. data/lib/bioroebe/constants/codon_tables.rb +0 -77
  370. data/lib/bioroebe/constants/database_constants.rb +0 -107
  371. data/lib/bioroebe/constants/files_and_directories.rb +0 -606
  372. data/lib/bioroebe/constants/misc.rb +0 -209
  373. data/lib/bioroebe/constants/newline.rb +0 -14
  374. data/lib/bioroebe/constants/nucleotides.rb +0 -121
  375. data/lib/bioroebe/constants/regex.rb +0 -28
  376. data/lib/bioroebe/constants/roebe.rb +0 -38
  377. data/lib/bioroebe/constants/row_terminator.rb +0 -16
  378. data/lib/bioroebe/constants/tabulator.rb +0 -14
  379. data/lib/bioroebe/constants/unicode.rb +0 -12
  380. data/lib/bioroebe/constants/urls.rb +0 -50
  381. data/lib/bioroebe/gui/gtk +0 -1
  382. data/lib/bioroebe/gui/gtk3/README.md +0 -2
  383. data/lib/bioroebe/gui/gtk3/alignment/alignment.rb +0 -306
  384. data/lib/bioroebe/gui/gtk3/anti_sense_strand/anti_sense_strand.rb +0 -29
  385. data/lib/bioroebe/gui/gtk3/blosum_matrix_viewer/blosum_matrix_viewer.rb +0 -195
  386. data/lib/bioroebe/gui/gtk3/calculate_cell_numbers_of_bacteria/calculate_cell_numbers_of_bacteria.rb +0 -105
  387. data/lib/bioroebe/gui/gtk3/dna_to_reverse_complement_widget/dna_to_reverse_complement_widget.rb +0 -188
  388. data/lib/bioroebe/gui/gtk3/fasta_table_widget/fasta_table_widget.rb +0 -322
  389. data/lib/bioroebe/gui/gtk3/gene/gene.rb +0 -181
  390. data/lib/bioroebe/gui/gtk3/hamming_distance/hamming_distance.rb +0 -383
  391. data/lib/bioroebe/gui/gtk3/levensthein_distance/levensthein_distance.rb +0 -174
  392. data/lib/bioroebe/gui/gtk3/protein_to_DNA/protein_to_DNA.rb +0 -181
  393. data/lib/bioroebe/gui/gtk3/show_codon_table/show_codon_table.rb +0 -101
  394. data/lib/bioroebe/gui/gtk3/show_codon_usage/show_codon_usage.rb +0 -145
  395. data/lib/bioroebe/gui/gtk3/three_to_one/title.rb +0 -23
  396. data/lib/bioroebe/gui/jruby/alignment/alignment.rb +0 -165
  397. data/lib/bioroebe/gui/jruby/aminoacid_composition/aminoacid_composition.rb +0 -166
  398. data/lib/bioroebe/gui/jruby/blosum_matrix_viewer/blosum_matrix_viewer.rb +0 -82
  399. data/lib/bioroebe/gui/libui/README.md +0 -4
  400. data/lib/bioroebe/gui/libui/alignment/alignment.rb +0 -116
  401. data/lib/bioroebe/gui/libui/blosum_matrix_viewer/blosum_matrix_viewer.rb +0 -112
  402. data/lib/bioroebe/gui/libui/calculate_cell_numbers_of_bacteria/calculate_cell_numbers_of_bacteria.rb +0 -60
  403. data/lib/bioroebe/gui/libui/controller/controller.rb +0 -116
  404. data/lib/bioroebe/gui/libui/dna_to_aminoacid_widget/dna_to_aminoacid_widget.rb +0 -161
  405. data/lib/bioroebe/gui/libui/dna_to_reverse_complement_widget/dna_to_reverse_complement_widget.rb +0 -76
  406. data/lib/bioroebe/gui/libui/hamming_distance/hamming_distance.rb +0 -135
  407. data/lib/bioroebe/gui/libui/levensthein_distance/levensthein_distance.rb +0 -118
  408. data/lib/bioroebe/gui/libui/protein_to_DNA/protein_to_DNA.rb +0 -115
  409. data/lib/bioroebe/gui/libui/random_sequence/random_sequence.rb +0 -190
  410. data/lib/bioroebe/gui/libui/show_codon_table/show_codon_table.rb +0 -134
  411. data/lib/bioroebe/gui/libui/show_codon_usage/show_codon_usage.rb +0 -89
  412. data/lib/bioroebe/gui/libui/three_to_one/three_to_one.rb +0 -113
  413. data/lib/bioroebe/gui/shared_code/alignment/alignment_module.rb +0 -102
  414. data/lib/bioroebe/gui/shared_code/aminoacid_composition/aminoacid_composition_module.rb +0 -94
  415. data/lib/bioroebe/gui/shared_code/calculate_cell_numbers_of_bacteria/calculate_cell_numbers_of_bacteria_module.rb +0 -216
  416. data/lib/bioroebe/gui/shared_code/protein_to_DNA/protein_to_DNA_module.rb +0 -192
  417. data/lib/bioroebe/gui/shared_code/show_codon_table/show_codon_table_module.rb +0 -72
  418. data/lib/bioroebe/gui/tk/aminoacid_composition/aminoacid_composition.rb +0 -206
  419. data/lib/bioroebe/gui/tk/blosum_matrix_viewer/blosum_matrix_viewer.rb +0 -140
  420. data/lib/bioroebe/gui/tk/hamming_distance/hamming_distance.rb +0 -262
  421. data/lib/bioroebe/gui/tk/levensthein_distance/levensthein_distance.rb +0 -243
  422. data/lib/bioroebe/gui/tk/three_to_one/three_to_one.rb +0 -199
  423. data/lib/bioroebe/gui/unified_widgets/anti_sense_strand/anti_sense_strand.rb +0 -519
  424. data/lib/bioroebe/shell/colours/colours.rb +0 -235
  425. data/lib/bioroebe/shell/help/help.rb +0 -25
  426. data/lib/bioroebe/shell/misc.rb +0 -10227
  427. data/lib/bioroebe/toplevel_methods/ad_hoc_task.rb +0 -56
  428. data/lib/bioroebe/toplevel_methods/aminoacids_and_proteins.rb +0 -722
  429. data/lib/bioroebe/toplevel_methods/atomic_composition.rb +0 -198
  430. data/lib/bioroebe/toplevel_methods/base_composition.rb +0 -121
  431. data/lib/bioroebe/toplevel_methods/blast.rb +0 -153
  432. data/lib/bioroebe/toplevel_methods/calculate_n50_value.rb +0 -57
  433. data/lib/bioroebe/toplevel_methods/cat.rb +0 -71
  434. data/lib/bioroebe/toplevel_methods/chunked_display.rb +0 -92
  435. data/lib/bioroebe/toplevel_methods/cliner.rb +0 -81
  436. data/lib/bioroebe/toplevel_methods/complement.rb +0 -58
  437. data/lib/bioroebe/toplevel_methods/convert_global_env.rb +0 -39
  438. data/lib/bioroebe/toplevel_methods/databases.rb +0 -73
  439. data/lib/bioroebe/toplevel_methods/delimiter.rb +0 -19
  440. data/lib/bioroebe/toplevel_methods/digest.rb +0 -81
  441. data/lib/bioroebe/toplevel_methods/download_and_fetch_data.rb +0 -146
  442. data/lib/bioroebe/toplevel_methods/e.rb +0 -20
  443. data/lib/bioroebe/toplevel_methods/editor.rb +0 -21
  444. data/lib/bioroebe/toplevel_methods/esystem.rb +0 -22
  445. data/lib/bioroebe/toplevel_methods/exponential_growth.rb +0 -74
  446. data/lib/bioroebe/toplevel_methods/extract.rb +0 -56
  447. data/lib/bioroebe/toplevel_methods/file_and_directory_related_actions.rb +0 -269
  448. data/lib/bioroebe/toplevel_methods/frequencies.rb +0 -99
  449. data/lib/bioroebe/toplevel_methods/hamming_distance.rb +0 -60
  450. data/lib/bioroebe/toplevel_methods/infer.rb +0 -66
  451. data/lib/bioroebe/toplevel_methods/leading_five_prime_and_trailing_three_prime.rb +0 -101
  452. data/lib/bioroebe/toplevel_methods/levensthein.rb +0 -63
  453. data/lib/bioroebe/toplevel_methods/log_directory.rb +0 -109
  454. data/lib/bioroebe/toplevel_methods/longest_common_substring.rb +0 -55
  455. data/lib/bioroebe/toplevel_methods/map_ncbi_entry_to_eutils_id.rb +0 -88
  456. data/lib/bioroebe/toplevel_methods/matches.rb +0 -259
  457. data/lib/bioroebe/toplevel_methods/misc.rb +0 -596
  458. data/lib/bioroebe/toplevel_methods/nucleotides.rb +0 -787
  459. data/lib/bioroebe/toplevel_methods/number_of_clones.rb +0 -63
  460. data/lib/bioroebe/toplevel_methods/open_in_browser.rb +0 -79
  461. data/lib/bioroebe/toplevel_methods/open_reading_frames.rb +0 -236
  462. data/lib/bioroebe/toplevel_methods/opn.rb +0 -34
  463. data/lib/bioroebe/toplevel_methods/palindromes.rb +0 -155
  464. data/lib/bioroebe/toplevel_methods/parse.rb +0 -59
  465. data/lib/bioroebe/toplevel_methods/phred_error_probability.rb +0 -68
  466. data/lib/bioroebe/toplevel_methods/rds.rb +0 -24
  467. data/lib/bioroebe/toplevel_methods/remove.rb +0 -86
  468. data/lib/bioroebe/toplevel_methods/return_source_code_of_this_method.rb +0 -35
  469. data/lib/bioroebe/toplevel_methods/return_subsequence_based_on_indices.rb +0 -68
  470. data/lib/bioroebe/toplevel_methods/rna_splicing.rb +0 -73
  471. data/lib/bioroebe/toplevel_methods/rnalfold.rb +0 -69
  472. data/lib/bioroebe/toplevel_methods/searching_and_finding.rb +0 -116
  473. data/lib/bioroebe/toplevel_methods/shuffleseq.rb +0 -37
  474. data/lib/bioroebe/toplevel_methods/statistics.rb +0 -53
  475. data/lib/bioroebe/toplevel_methods/sum_of_odd_integers.rb +0 -62
  476. data/lib/bioroebe/toplevel_methods/three_delimiter.rb +0 -34
  477. data/lib/bioroebe/toplevel_methods/time_and_date.rb +0 -53
  478. data/lib/bioroebe/toplevel_methods/to_camelcase.rb +0 -31
  479. data/lib/bioroebe/toplevel_methods/truncate.rb +0 -48
  480. data/lib/bioroebe/toplevel_methods/url.rb +0 -36
  481. data/lib/bioroebe/toplevel_methods/verbose.rb +0 -59
  482. data/lib/bioroebe/utility_scripts/showorf/constants.rb +0 -31
  483. data/lib/bioroebe/utility_scripts/showorf/help.rb +0 -33
  484. data/lib/bioroebe/utility_scripts/showorf/initialize.rb +0 -52
  485. data/lib/bioroebe/utility_scripts/showorf/menu.rb +0 -68
  486. data/lib/bioroebe/utility_scripts/showorf/reset.rb +0 -36
  487. data/lib/bioroebe/utility_scripts/showorf/run.rb +0 -152
  488. data/lib/bioroebe/utility_scripts/showorf/show.rb +0 -97
  489. /data/doc/{german_names_for_the_aminoacids.md → german_names_for_the_aminoacids/german_names_for_the_aminoacids.md} +0 -0
  490. /data/doc/{pdb_ATOM_entry.md → pdb_ATOM_entry/pdb_ATOM_entry.md} +0 -0
  491. /data/doc/{resources.md → resources/resources.md} +0 -0
  492. /data/lib/bioroebe/gui/{gtk3 → universal_widgets}/aminoacid_composition/customized_dialog.rb +0 -0
  493. /data/lib/bioroebe/gui/{gtk3 → universal_widgets}/anti_sense_strand/anti_sense_strand.config +0 -0
  494. /data/lib/bioroebe/gui/{gtk3 → universal_widgets}/calculate_cell_numbers_of_bacteria/calculate_cell_numbers_of_bacteria.config +0 -0
  495. /data/lib/bioroebe/gui/{gtk3 → universal_widgets}/dna_to_reverse_complement_widget/dna_to_reverse_complement_widget.config +0 -0
  496. /data/lib/bioroebe/gui/{gtk3 → universal_widgets}/hamming_distance/hamming_distance.config +0 -0
  497. /data/lib/bioroebe/gui/{gtk3 → universal_widgets}/levensthein_distance/levensthein_distance.config +0 -0
  498. /data/lib/bioroebe/gui/{gtk3 → universal_widgets}/protein_to_DNA/protein_to_DNA.config +0 -0
  499. /data/lib/bioroebe/gui/{gtk3 → universal_widgets}/restriction_enzymes/restriction_enzymes.config +0 -0
  500. /data/lib/bioroebe/gui/{gtk3 → universal_widgets}/www_finder/www_finder.config +0 -0
  501. /data/lib/bioroebe/yaml/{base_composition_of_dna.yml → base_composition_of_dna/base_composition_of_dna.yml} +0 -0
  502. /data/lib/bioroebe/yaml/{nuclear_localization_sequences.yml → nuclear_localization_sequences/nuclear_localization_sequences.yml} +0 -0
  503. /data/lib/bioroebe/yaml/{talens.yml → talens/talens.yml} +0 -0
@@ -1,36 +1,47 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
1
+ <!DOCTYPE html lang="en">
3
2
  <head>
4
- <meta charset="UTF-8">
5
3
  <title>
6
- images</title>
7
-
4
+ images
5
+ </title>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
8
7
  <style>
9
8
 
10
- a:link { text-decoration: none; color: gold; }
11
- a:hover { text-decoration: none; color: lightblue; }
12
-
13
- </style>
9
+ body {
10
+ font-size: 1.20em;
11
+ }
14
12
 
13
+ .pad6px { padding:6px }
14
+ .marl2em { margin-left: 2em }
15
+ .yellowgreen { color: #9ACD32 }
16
+ .lightgreen { color: #d2ffb7; }
17
+ .pad12px { padding:12px }
18
+ .BG_Black { background-color: #000000; }
19
+ .rounded_border { border-radius: 10px; }
20
+ .marr10px { margin-right: 10px; }
21
+
22
+ a:link,
23
+ a:visited { text-decoration: none; color: gold; }
24
+ a:hover { text-decoration: none; color: lightblue; }
25
+
26
+ body { font-size: 1.20em; }
27
+
28
+ </style>
15
29
  </head>
16
- <body style="
17
- background-color: black; color: white; font-size: 1.3em;">
30
+ <!-- The font size in use is: 1.20em -->
31
+ <body style="background-color: black; color: white; font-size: 1.3em;">
18
32
 
19
33
  <!-- Adding support for jquery next: -->
20
34
 
21
35
  <script>
22
36
  /*!
23
- * jQuery JavaScript Library v3.6.3
37
+ * jQuery JavaScript Library v3.7.0
24
38
  * https://jquery.com/
25
39
  *
26
- * Includes Sizzle.js
27
- * https://sizzlejs.com/
28
- *
29
40
  * Copyright OpenJS Foundation and other contributors
30
41
  * Released under the MIT license
31
42
  * https://jquery.org/license
32
43
  *
33
- * Date: 2022-12-20T21:28Z
44
+ * Date: 2023-05-11T18:29Z
34
45
  */
35
46
  ( function( global, factory ) {
36
47
 
@@ -171,8 +182,9 @@ function toType( obj ) {
171
182
 
172
183
 
173
184
 
174
- var
175
- version = "3.6.3",
185
+ var version = "3.7.0",
186
+
187
+ rhtmlSuffix = /HTML$/i,
176
188
 
177
189
  // Define a local copy of jQuery
178
190
  jQuery = function( selector, context ) {
@@ -418,6 +430,33 @@ jQuery.extend( {
418
430
  return obj;
419
431
  },
420
432
 
433
+
434
+ // Retrieve the text value of an array of DOM nodes
435
+ text: function( elem ) {
436
+ var node,
437
+ ret = "",
438
+ i = 0,
439
+ nodeType = elem.nodeType;
440
+
441
+ if ( !nodeType ) {
442
+
443
+ // If no nodeType, this is expected to be an array
444
+ while ( ( node = elem[ i++ ] ) ) {
445
+
446
+ // Do not traverse comment nodes
447
+ ret += jQuery.text( node );
448
+ }
449
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
450
+ return elem.textContent;
451
+ } else if ( nodeType === 3 || nodeType === 4 ) {
452
+ return elem.nodeValue;
453
+ }
454
+
455
+ // Do not include comment or processing instruction nodes
456
+
457
+ return ret;
458
+ },
459
+
421
460
  // results is for internal usage only
422
461
  makeArray: function( arr, results ) {
423
462
  var ret = results || [];
@@ -440,6 +479,15 @@ jQuery.extend( {
440
479
  return arr == null ? -1 : indexOf.call( arr, elem, i );
441
480
  },
442
481
 
482
+ isXMLDoc: function( elem ) {
483
+ var namespace = elem && elem.namespaceURI,
484
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
485
+
486
+ // Assume HTML when documentElement doesn't yet exist, such as inside
487
+ // document fragments.
488
+ return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" );
489
+ },
490
+
443
491
  // Support: Android <=4.0 only, PhantomJS 1 only
444
492
  // push.apply(_, arraylike) throws on ancient WebKit
445
493
  merge: function( first, second ) {
@@ -541,43 +589,98 @@ function isArrayLike( obj ) {
541
589
  return type === "array" || length === 0 ||
542
590
  typeof length === "number" && length > 0 && ( length - 1 ) in obj;
543
591
  }
544
- var Sizzle =
545
- /*!
546
- * Sizzle CSS Selector Engine v2.3.9
547
- * https://sizzlejs.com/
548
- *
549
- * Copyright JS Foundation and other contributors
550
- * Released under the MIT license
551
- * https://js.foundation/
552
- *
553
- * Date: 2022-12-19
554
- */
555
- ( function( window ) {
592
+
593
+
594
+ function nodeName( elem, name ) {
595
+
596
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
597
+
598
+ }
599
+ var pop = arr.pop;
600
+
601
+
602
+ var sort = arr.sort;
603
+
604
+
605
+ var splice = arr.splice;
606
+
607
+
608
+ var whitespace = "[\\x20\\t\\r\\n\\f]";
609
+
610
+
611
+ var rtrimCSS = new RegExp(
612
+ "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
613
+ "g"
614
+ );
615
+
616
+
617
+
618
+
619
+ // Note: an element does not contain itself
620
+ jQuery.contains = function( a, b ) {
621
+ var bup = b && b.parentNode;
622
+
623
+ return a === bup || !!( bup && bup.nodeType === 1 && (
624
+
625
+ // Support: IE 9 - 11+
626
+ // IE doesn't have `contains` on SVG.
627
+ a.contains ?
628
+ a.contains( bup ) :
629
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
630
+ ) );
631
+ };
632
+
633
+
634
+
635
+
636
+ // CSS string/identifier serialization
637
+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
638
+ var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
639
+
640
+ function fcssescape( ch, asCodePoint ) {
641
+ if ( asCodePoint ) {
642
+
643
+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
644
+ if ( ch === "\0" ) {
645
+ return "\uFFFD";
646
+ }
647
+
648
+ // Control characters and (dependent upon position) numbers get escaped as code points
649
+ return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
650
+ }
651
+
652
+ // Other potentially-special ASCII characters get backslash-escaped
653
+ return "\\" + ch;
654
+ }
655
+
656
+ jQuery.escapeSelector = function( sel ) {
657
+ return ( sel + "" ).replace( rcssescape, fcssescape );
658
+ };
659
+
660
+
661
+
662
+
663
+ var preferredDoc = document,
664
+ pushNative = push;
665
+
666
+ ( function() {
667
+
556
668
  var i,
557
- support,
558
669
  Expr,
559
- getText,
560
- isXML,
561
- tokenize,
562
- compile,
563
- select,
564
670
  outermostContext,
565
671
  sortInput,
566
672
  hasDuplicate,
673
+ push = pushNative,
567
674
 
568
675
  // Local document vars
569
- setDocument,
570
676
  document,
571
- docElem,
677
+ documentElement,
572
678
  documentIsHTML,
573
679
  rbuggyQSA,
574
- rbuggyMatches,
575
680
  matches,
576
- contains,
577
681
 
578
682
  // Instance-specific data
579
- expando = "sizzle" + 1 * new Date(),
580
- preferredDoc = window.document,
683
+ expando = jQuery.expando,
581
684
  dirruns = 0,
582
685
  done = 0,
583
686
  classCache = createCache(),
@@ -591,47 +694,22 @@ var i,
591
694
  return 0;
592
695
  },
593
696
 
594
- // Instance methods
595
- hasOwn = ( {} ).hasOwnProperty,
596
- arr = [],
597
- pop = arr.pop,
598
- pushNative = arr.push,
599
- push = arr.push,
600
- slice = arr.slice,
601
-
602
- // Use a stripped-down indexOf as it's faster than native
603
- // https://jsperf.com/thor-indexof-vs-for/5
604
- indexOf = function( list, elem ) {
605
- var i = 0,
606
- len = list.length;
607
- for ( ; i < len; i++ ) {
608
- if ( list[ i ] === elem ) {
609
- return i;
610
- }
611
- }
612
- return -1;
613
- },
614
-
615
- booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
616
- "ismap|loop|multiple|open|readonly|required|scoped",
697
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" +
698
+ "loop|multiple|open|readonly|required|scoped",
617
699
 
618
700
  // Regular expressions
619
701
 
620
- // http://www.w3.org/TR/css3-selectors/#whitespace
621
- whitespace = "[\\x20\\t\\r\\n\\f]",
622
-
623
702
  // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
624
703
  identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
625
704
  "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
626
705
 
627
- // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
706
+ // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors
628
707
  attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
629
708
 
630
709
  // Operator (capture 2)
631
710
  "*([*^$|!~]?=)" + whitespace +
632
711
 
633
- // "Attribute values must be CSS identifiers [capture 5]
634
- // or strings [capture 3 or capture 4]"
712
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
635
713
  "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
636
714
  whitespace + "*\\]",
637
715
 
@@ -650,101 +728,88 @@ var i,
650
728
 
651
729
  // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
652
730
  rwhitespace = new RegExp( whitespace + "+", "g" ),
653
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
654
- whitespace + "+$", "g" ),
655
731
 
656
732
  rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
657
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
658
- "*" ),
733
+ rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" +
734
+ whitespace + "*" ),
659
735
  rdescend = new RegExp( whitespace + "|>" ),
660
736
 
661
737
  rpseudo = new RegExp( pseudos ),
662
738
  ridentifier = new RegExp( "^" + identifier + "$" ),
663
739
 
664
740
  matchExpr = {
665
- "ID": new RegExp( "^#(" + identifier + ")" ),
666
- "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
667
- "TAG": new RegExp( "^(" + identifier + "|[*])" ),
668
- "ATTR": new RegExp( "^" + attributes ),
669
- "PSEUDO": new RegExp( "^" + pseudos ),
670
- "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
671
- whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
672
- whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
673
- "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
741
+ ID: new RegExp( "^#(" + identifier + ")" ),
742
+ CLASS: new RegExp( "^\\.(" + identifier + ")" ),
743
+ TAG: new RegExp( "^(" + identifier + "|[*])" ),
744
+ ATTR: new RegExp( "^" + attributes ),
745
+ PSEUDO: new RegExp( "^" + pseudos ),
746
+ CHILD: new RegExp(
747
+ "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
748
+ whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
749
+ whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
750
+ bool: new RegExp( "^(?:" + booleans + ")$", "i" ),
674
751
 
675
752
  // For use in libraries implementing .is()
676
753
  // We use this for POS matching in `select`
677
- "needsContext": new RegExp( "^" + whitespace +
754
+ needsContext: new RegExp( "^" + whitespace +
678
755
  "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
679
756
  "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
680
757
  },
681
758
 
682
- rhtml = /HTML$/i,
683
759
  rinputs = /^(?:input|select|textarea|button)$/i,
684
760
  rheader = /^h\d$/i,
685
761
 
686
- rnative = /^[^{]+\{\s*\[native \w/,
687
-
688
762
  // Easily-parseable/retrievable ID or TAG or CLASS selectors
689
763
  rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
690
764
 
691
765
  rsibling = /[+~]/,
692
766
 
693
767
  // CSS escapes
694
- // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
695
- runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
768
+ // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters
769
+ runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace +
770
+ "?|\\\\([^\\r\\n\\f])", "g" ),
696
771
  funescape = function( escape, nonHex ) {
697
772
  var high = "0x" + escape.slice( 1 ) - 0x10000;
698
773
 
699
- return nonHex ?
774
+ if ( nonHex ) {
700
775
 
701
776
  // Strip the backslash prefix from a non-hex escape sequence
702
- nonHex :
703
-
704
- // Replace a hexadecimal escape sequence with the encoded Unicode code point
705
- // Support: IE <=11+
706
- // For values outside the Basic Multilingual Plane (BMP), manually construct a
707
- // surrogate pair
708
- high < 0 ?
709
- String.fromCharCode( high + 0x10000 ) :
710
- String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
711
- },
712
-
713
- // CSS string/identifier serialization
714
- // https://drafts.csswg.org/cssom/#common-serializing-idioms
715
- rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
716
- fcssescape = function( ch, asCodePoint ) {
717
- if ( asCodePoint ) {
718
-
719
- // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
720
- if ( ch === "\0" ) {
721
- return "\uFFFD";
722
- }
723
-
724
- // Control characters and (dependent upon position) numbers get escaped as code points
725
- return ch.slice( 0, -1 ) + "\\" +
726
- ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
777
+ return nonHex;
727
778
  }
728
779
 
729
- // Other potentially-special ASCII characters get backslash-escaped
730
- return "\\" + ch;
780
+ // Replace a hexadecimal escape sequence with the encoded Unicode code point
781
+ // Support: IE <=11+
782
+ // For values outside the Basic Multilingual Plane (BMP), manually construct a
783
+ // surrogate pair
784
+ return high < 0 ?
785
+ String.fromCharCode( high + 0x10000 ) :
786
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
731
787
  },
732
788
 
733
- // Used for iframes
734
- // See setDocument()
789
+ // Used for iframes; see `setDocument`.
790
+ // Support: IE 9 - 11+, Edge 12 - 18+
735
791
  // Removing the function wrapper causes a "Permission Denied"
736
- // error in IE
792
+ // error in IE/Edge.
737
793
  unloadHandler = function() {
738
794
  setDocument();
739
795
  },
740
796
 
741
797
  inDisabledFieldset = addCombinator(
742
798
  function( elem ) {
743
- return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
799
+ return elem.disabled === true && nodeName( elem, "fieldset" );
744
800
  },
745
801
  { dir: "parentNode", next: "legend" }
746
802
  );
747
803
 
804
+ // Support: IE <=9 only
805
+ // Accessing document.activeElement can throw unexpectedly
806
+ // https://bugs.jquery.com/ticket/13393
807
+ function safeActiveElement() {
808
+ try {
809
+ return document.activeElement;
810
+ } catch ( err ) { }
811
+ }
812
+
748
813
  // Optimize for push.apply( _, NodeList )
749
814
  try {
750
815
  push.apply(
@@ -752,32 +817,22 @@ try {
752
817
  preferredDoc.childNodes
753
818
  );
754
819
 
755
- // Support: Android<4.0
820
+ // Support: Android <=4.0
756
821
  // Detect silently failing push.apply
757
822
  // eslint-disable-next-line no-unused-expressions
758
823
  arr[ preferredDoc.childNodes.length ].nodeType;
759
824
  } catch ( e ) {
760
- push = { apply: arr.length ?
761
-
762
- // Leverage slice if possible
763
- function( target, els ) {
825
+ push = {
826
+ apply: function( target, els ) {
764
827
  pushNative.apply( target, slice.call( els ) );
765
- } :
766
-
767
- // Support: IE<9
768
- // Otherwise append directly
769
- function( target, els ) {
770
- var j = target.length,
771
- i = 0;
772
-
773
- // Can't trust NodeList.length
774
- while ( ( target[ j++ ] = els[ i++ ] ) ) {}
775
- target.length = j - 1;
828
+ },
829
+ call: function( target ) {
830
+ pushNative.apply( target, slice.call( arguments, 1 ) );
776
831
  }
777
832
  };
778
833
  }
779
834
 
780
- function Sizzle( selector, context, results, seed ) {
835
+ function find( selector, context, results, seed ) {
781
836
  var m, i, elem, nid, match, groups, newSelector,
782
837
  newContext = context && context.ownerDocument,
783
838
 
@@ -811,11 +866,10 @@ function Sizzle( selector, context, results, seed ) {
811
866
  if ( nodeType === 9 ) {
812
867
  if ( ( elem = context.getElementById( m ) ) ) {
813
868
 
814
- // Support: IE, Opera, Webkit
815
- // TODO: identify versions
869
+ // Support: IE 9 only
816
870
  // getElementById can match elements by name instead of ID
817
871
  if ( elem.id === m ) {
818
- results.push( elem );
872
+ push.call( results, elem );
819
873
  return results;
820
874
  }
821
875
  } else {
@@ -825,14 +879,13 @@ function Sizzle( selector, context, results, seed ) {
825
879
  // Element context
826
880
  } else {
827
881
 
828
- // Support: IE, Opera, Webkit
829
- // TODO: identify versions
882
+ // Support: IE 9 only
830
883
  // getElementById can match elements by name instead of ID
831
884
  if ( newContext && ( elem = newContext.getElementById( m ) ) &&
832
- contains( context, elem ) &&
885
+ find.contains( context, elem ) &&
833
886
  elem.id === m ) {
834
887
 
835
- results.push( elem );
888
+ push.call( results, elem );
836
889
  return results;
837
890
  }
838
891
  }
@@ -843,22 +896,15 @@ function Sizzle( selector, context, results, seed ) {
843
896
  return results;
844
897
 
845
898
  // Class selector
846
- } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
847
- context.getElementsByClassName ) {
848
-
899
+ } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {
849
900
  push.apply( results, context.getElementsByClassName( m ) );
850
901
  return results;
851
902
  }
852
903
  }
853
904
 
854
905
  // Take advantage of querySelectorAll
855
- if ( support.qsa &&
856
- !nonnativeSelectorCache[ selector + " " ] &&
857
- ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
858
-
859
- // Support: IE 8 only
860
- // Exclude object elements
861
- ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
906
+ if ( !nonnativeSelectorCache[ selector + " " ] &&
907
+ ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {
862
908
 
863
909
  newSelector = selector;
864
910
  newContext = context;
@@ -871,7 +917,7 @@ function Sizzle( selector, context, results, seed ) {
871
917
  // as such selectors are not recognized by querySelectorAll.
872
918
  // Thanks to Andrew Dupont for this technique.
873
919
  if ( nodeType === 1 &&
874
- ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
920
+ ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {
875
921
 
876
922
  // Expand context for sibling selectors
877
923
  newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
@@ -879,11 +925,15 @@ function Sizzle( selector, context, results, seed ) {
879
925
 
880
926
  // We can use :scope instead of the ID hack if the browser
881
927
  // supports it & if we're not changing the context.
882
- if ( newContext !== context || !support.scope ) {
928
+ // Support: IE 11+, Edge 17 - 18+
929
+ // IE/Edge sometimes throw a "Permission denied" error when
930
+ // strict-comparing two documents; shallow comparisons work.
931
+ // eslint-disable-next-line eqeqeq
932
+ if ( newContext != context || !support.scope ) {
883
933
 
884
934
  // Capture the context ID, setting it first if necessary
885
935
  if ( ( nid = context.getAttribute( "id" ) ) ) {
886
- nid = nid.replace( rcssescape, fcssescape );
936
+ nid = jQuery.escapeSelector( nid );
887
937
  } else {
888
938
  context.setAttribute( "id", ( nid = expando ) );
889
939
  }
@@ -900,27 +950,6 @@ function Sizzle( selector, context, results, seed ) {
900
950
  }
901
951
 
902
952
  try {
903
-
904
- // `qSA` may not throw for unrecognized parts using forgiving parsing:
905
- // https://drafts.csswg.org/selectors/#forgiving-selector
906
- // like the `:has()` pseudo-class:
907
- // https://drafts.csswg.org/selectors/#relational
908
- // `CSS.supports` is still expected to return `false` then:
909
- // https://drafts.csswg.org/css-conditional-4/#typedef-supports-selector-fn
910
- // https://drafts.csswg.org/css-conditional-4/#dfn-support-selector
911
- if ( support.cssSupportsSelector &&
912
-
913
- // eslint-disable-next-line no-undef
914
- !CSS.supports( "selector(:is(" + newSelector + "))" ) ) {
915
-
916
- // Support: IE 11+
917
- // Throw to get to the same code path as an error directly in qSA.
918
- // Note: once we only support browser supporting
919
- // `CSS.supports('selector(...)')`, we can most likely drop
920
- // the `try-catch`. IE doesn't implement the API.
921
- throw new Error();
922
- }
923
-
924
953
  push.apply( results,
925
954
  newContext.querySelectorAll( newSelector )
926
955
  );
@@ -937,7 +966,7 @@ function Sizzle( selector, context, results, seed ) {
937
966
  }
938
967
 
939
968
  // All others
940
- return select( selector.replace( rtrim, "$1" ), context, results, seed );
969
+ return select( selector.replace( rtrimCSS, "$1" ), context, results, seed );
941
970
  }
942
971
 
943
972
  /**
@@ -951,7 +980,8 @@ function createCache() {
951
980
 
952
981
  function cache( key, value ) {
953
982
 
954
- // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
983
+ // Use (key + " ") to avoid collision with native prototype properties
984
+ // (see https://github.com/jquery/sizzle/issues/157)
955
985
  if ( keys.push( key + " " ) > Expr.cacheLength ) {
956
986
 
957
987
  // Only keep the most recent entries
@@ -963,7 +993,7 @@ function createCache() {
963
993
  }
964
994
 
965
995
  /**
966
- * Mark a function for special use by Sizzle
996
+ * Mark a function for special use by jQuery selector module
967
997
  * @param {Function} fn The function to mark
968
998
  */
969
999
  function markFunction( fn ) {
@@ -994,56 +1024,13 @@ function assert( fn ) {
994
1024
  }
995
1025
  }
996
1026
 
997
- /**
998
- * Adds the same handler for all of the specified attrs
999
- * @param {String} attrs Pipe-separated list of attributes
1000
- * @param {Function} handler The method that will be applied
1001
- */
1002
- function addHandle( attrs, handler ) {
1003
- var arr = attrs.split( "|" ),
1004
- i = arr.length;
1005
-
1006
- while ( i-- ) {
1007
- Expr.attrHandle[ arr[ i ] ] = handler;
1008
- }
1009
- }
1010
-
1011
- /**
1012
- * Checks document order of two siblings
1013
- * @param {Element} a
1014
- * @param {Element} b
1015
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
1016
- */
1017
- function siblingCheck( a, b ) {
1018
- var cur = b && a,
1019
- diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
1020
- a.sourceIndex - b.sourceIndex;
1021
-
1022
- // Use IE sourceIndex if available on both nodes
1023
- if ( diff ) {
1024
- return diff;
1025
- }
1026
-
1027
- // Check if b follows a
1028
- if ( cur ) {
1029
- while ( ( cur = cur.nextSibling ) ) {
1030
- if ( cur === b ) {
1031
- return -1;
1032
- }
1033
- }
1034
- }
1035
-
1036
- return a ? 1 : -1;
1037
- }
1038
-
1039
1027
  /**
1040
1028
  * Returns a function to use in pseudos for input types
1041
1029
  * @param {String} type
1042
1030
  */
1043
1031
  function createInputPseudo( type ) {
1044
1032
  return function( elem ) {
1045
- var name = elem.nodeName.toLowerCase();
1046
- return name === "input" && elem.type === type;
1033
+ return nodeName( elem, "input" ) && elem.type === type;
1047
1034
  };
1048
1035
  }
1049
1036
 
@@ -1053,8 +1040,8 @@ function createInputPseudo( type ) {
1053
1040
  */
1054
1041
  function createButtonPseudo( type ) {
1055
1042
  return function( elem ) {
1056
- var name = elem.nodeName.toLowerCase();
1057
- return ( name === "input" || name === "button" ) && elem.type === type;
1043
+ return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) &&
1044
+ elem.type === type;
1058
1045
  };
1059
1046
  }
1060
1047
 
@@ -1090,14 +1077,13 @@ function createDisabledPseudo( disabled ) {
1090
1077
  }
1091
1078
  }
1092
1079
 
1093
- // Support: IE 6 - 11
1080
+ // Support: IE 6 - 11+
1094
1081
  // Use the isDisabled shortcut property to check for disabled fieldset ancestors
1095
1082
  return elem.isDisabled === disabled ||
1096
1083
 
1097
1084
  // Where there is no isDisabled, check manually
1098
- /* jshint -W018 */
1099
1085
  elem.isDisabled !== !disabled &&
1100
- inDisabledFieldset( elem ) === disabled;
1086
+ inDisabledFieldset( elem ) === disabled;
1101
1087
  }
1102
1088
 
1103
1089
  return elem.disabled === disabled;
@@ -1137,7 +1123,7 @@ function createPositionalPseudo( fn ) {
1137
1123
  }
1138
1124
 
1139
1125
  /**
1140
- * Checks a node for validity as a Sizzle context
1126
+ * Checks a node for validity as a jQuery selector context
1141
1127
  * @param {Element|Object=} context
1142
1128
  * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1143
1129
  */
@@ -1145,31 +1131,13 @@ function testContext( context ) {
1145
1131
  return context && typeof context.getElementsByTagName !== "undefined" && context;
1146
1132
  }
1147
1133
 
1148
- // Expose support vars for convenience
1149
- support = Sizzle.support = {};
1150
-
1151
- /**
1152
- * Detects XML nodes
1153
- * @param {Element|Object} elem An element or a document
1154
- * @returns {Boolean} True iff elem is a non-HTML XML node
1155
- */
1156
- isXML = Sizzle.isXML = function( elem ) {
1157
- var namespace = elem && elem.namespaceURI,
1158
- docElem = elem && ( elem.ownerDocument || elem ).documentElement;
1159
-
1160
- // Support: IE <=8
1161
- // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
1162
- // https://bugs.jquery.com/ticket/4833
1163
- return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
1164
- };
1165
-
1166
1134
  /**
1167
1135
  * Sets document-related variables once based on the current document
1168
- * @param {Element|Object} [doc] An element or document object to use to set the document
1136
+ * @param {Element|Object} [node] An element or document object to use to set the document
1169
1137
  * @returns {Object} Returns the current document
1170
1138
  */
1171
- setDocument = Sizzle.setDocument = function( node ) {
1172
- var hasCompare, subWindow,
1139
+ function setDocument( node ) {
1140
+ var subWindow,
1173
1141
  doc = node ? node.ownerDocument || node : preferredDoc;
1174
1142
 
1175
1143
  // Return early if doc is invalid or already selected
@@ -1183,11 +1151,17 @@ setDocument = Sizzle.setDocument = function( node ) {
1183
1151
 
1184
1152
  // Update global variables
1185
1153
  document = doc;
1186
- docElem = document.documentElement;
1187
- documentIsHTML = !isXML( document );
1154
+ documentElement = document.documentElement;
1155
+ documentIsHTML = !jQuery.isXMLDoc( document );
1156
+
1157
+ // Support: iOS 7 only, IE 9 - 11+
1158
+ // Older browsers didn't support unprefixed `matches`.
1159
+ matches = documentElement.matches ||
1160
+ documentElement.webkitMatchesSelector ||
1161
+ documentElement.msMatchesSelector;
1188
1162
 
1189
1163
  // Support: IE 9 - 11+, Edge 12 - 18+
1190
- // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1164
+ // Accessing iframe documents after unload throws "permission denied" errors (see trac-13936)
1191
1165
  // Support: IE 11+, Edge 17 - 18+
1192
1166
  // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1193
1167
  // two documents; shallow comparisons work.
@@ -1195,100 +1169,67 @@ setDocument = Sizzle.setDocument = function( node ) {
1195
1169
  if ( preferredDoc != document &&
1196
1170
  ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
1197
1171
 
1198
- // Support: IE 11, Edge
1199
- if ( subWindow.addEventListener ) {
1200
- subWindow.addEventListener( "unload", unloadHandler, false );
1201
-
1202
- // Support: IE 9 - 10 only
1203
- } else if ( subWindow.attachEvent ) {
1204
- subWindow.attachEvent( "onunload", unloadHandler );
1205
- }
1172
+ // Support: IE 9 - 11+, Edge 12 - 18+
1173
+ subWindow.addEventListener( "unload", unloadHandler );
1206
1174
  }
1207
1175
 
1208
- // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
1209
- // Safari 4 - 5 only, Opera <=11.6 - 12.x only
1210
- // IE/Edge & older browsers don't support the :scope pseudo-class.
1211
- // Support: Safari 6.0 only
1212
- // Safari 6.0 supports :scope but it's an alias of :root there.
1213
- support.scope = assert( function( el ) {
1214
- docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
1215
- return typeof el.querySelectorAll !== "undefined" &&
1216
- !el.querySelectorAll( ":scope fieldset div" ).length;
1217
- } );
1218
-
1219
- // Support: Chrome 105+, Firefox 104+, Safari 15.4+
1220
- // Make sure forgiving mode is not used in `CSS.supports( "selector(...)" )`.
1221
- //
1222
- // `:is()` uses a forgiving selector list as an argument and is widely
1223
- // implemented, so it's a good one to test against.
1224
- support.cssSupportsSelector = assert( function() {
1225
- /* eslint-disable no-undef */
1226
-
1227
- return CSS.supports( "selector(*)" ) &&
1228
-
1229
- // Support: Firefox 78-81 only
1230
- // In old Firefox, `:is()` didn't use forgiving parsing. In that case,
1231
- // fail this test as there's no selector to test against that.
1232
- // `CSS.supports` uses unforgiving parsing
1233
- document.querySelectorAll( ":is(:jqfake)" ) &&
1234
-
1235
- // `*` is needed as Safari & newer Chrome implemented something in between
1236
- // for `:has()` - it throws in `qSA` if it only contains an unsupported
1237
- // argument but multiple ones, one of which is supported, are fine.
1238
- // We want to play safe in case `:is()` gets the same treatment.
1239
- !CSS.supports( "selector(:is(*,:jqfake))" );
1240
-
1241
- /* eslint-enable */
1176
+ // Support: IE <10
1177
+ // Check if getElementById returns elements by name
1178
+ // The broken getElementById methods don't pick up programmatically-set names,
1179
+ // so use a roundabout getElementsByName test
1180
+ support.getById = assert( function( el ) {
1181
+ documentElement.appendChild( el ).id = jQuery.expando;
1182
+ return !document.getElementsByName ||
1183
+ !document.getElementsByName( jQuery.expando ).length;
1242
1184
  } );
1243
1185
 
1244
- /* Attributes
1245
- ---------------------------------------------------------------------- */
1246
-
1247
- // Support: IE<8
1248
- // Verify that getAttribute really returns attributes and not properties
1249
- // (excepting IE8 booleans)
1250
- support.attributes = assert( function( el ) {
1251
- el.className = "i";
1252
- return !el.getAttribute( "className" );
1186
+ // Support: IE 9 only
1187
+ // Check to see if it's possible to do matchesSelector
1188
+ // on a disconnected node.
1189
+ support.disconnectedMatch = assert( function( el ) {
1190
+ return matches.call( el, "*" );
1253
1191
  } );
1254
1192
 
1255
- /* getElement(s)By*
1256
- ---------------------------------------------------------------------- */
1257
-
1258
- // Check if getElementsByTagName("*") returns only elements
1259
- support.getElementsByTagName = assert( function( el ) {
1260
- el.appendChild( document.createComment( "" ) );
1261
- return !el.getElementsByTagName( "*" ).length;
1193
+ // Support: IE 9 - 11+, Edge 12 - 18+
1194
+ // IE/Edge don't support the :scope pseudo-class.
1195
+ support.scope = assert( function() {
1196
+ return document.querySelectorAll( ":scope" );
1262
1197
  } );
1263
1198
 
1264
- // Support: IE<9
1265
- support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1266
-
1267
- // Support: IE<10
1268
- // Check if getElementById returns elements by name
1269
- // The broken getElementById methods don't pick up programmatically-set names,
1270
- // so use a roundabout getElementsByName test
1271
- support.getById = assert( function( el ) {
1272
- docElem.appendChild( el ).id = expando;
1273
- return !document.getElementsByName || !document.getElementsByName( expando ).length;
1199
+ // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only
1200
+ // Make sure the `:has()` argument is parsed unforgivingly.
1201
+ // We include `*` in the test to detect buggy implementations that are
1202
+ // _selectively_ forgiving (specifically when the list includes at least
1203
+ // one valid selector).
1204
+ // Note that we treat complete lack of support for `:has()` as if it were
1205
+ // spec-compliant support, which is fine because use of `:has()` in such
1206
+ // environments will fail in the qSA path and fall back to jQuery traversal
1207
+ // anyway.
1208
+ support.cssHas = assert( function() {
1209
+ try {
1210
+ document.querySelector( ":has(*,:jqfake)" );
1211
+ return false;
1212
+ } catch ( e ) {
1213
+ return true;
1214
+ }
1274
1215
  } );
1275
1216
 
1276
1217
  // ID filter and find
1277
1218
  if ( support.getById ) {
1278
- Expr.filter[ "ID" ] = function( id ) {
1219
+ Expr.filter.ID = function( id ) {
1279
1220
  var attrId = id.replace( runescape, funescape );
1280
1221
  return function( elem ) {
1281
1222
  return elem.getAttribute( "id" ) === attrId;
1282
1223
  };
1283
1224
  };
1284
- Expr.find[ "ID" ] = function( id, context ) {
1225
+ Expr.find.ID = function( id, context ) {
1285
1226
  if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1286
1227
  var elem = context.getElementById( id );
1287
1228
  return elem ? [ elem ] : [];
1288
1229
  }
1289
1230
  };
1290
1231
  } else {
1291
- Expr.filter[ "ID" ] = function( id ) {
1232
+ Expr.filter.ID = function( id ) {
1292
1233
  var attrId = id.replace( runescape, funescape );
1293
1234
  return function( elem ) {
1294
1235
  var node = typeof elem.getAttributeNode !== "undefined" &&
@@ -1299,7 +1240,7 @@ setDocument = Sizzle.setDocument = function( node ) {
1299
1240
 
1300
1241
  // Support: IE 6 - 7 only
1301
1242
  // getElementById is not reliable as a find shortcut
1302
- Expr.find[ "ID" ] = function( id, context ) {
1243
+ Expr.find.ID = function( id, context ) {
1303
1244
  if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1304
1245
  var node, i, elems,
1305
1246
  elem = context.getElementById( id );
@@ -1329,40 +1270,18 @@ setDocument = Sizzle.setDocument = function( node ) {
1329
1270
  }
1330
1271
 
1331
1272
  // Tag
1332
- Expr.find[ "TAG" ] = support.getElementsByTagName ?
1333
- function( tag, context ) {
1334
- if ( typeof context.getElementsByTagName !== "undefined" ) {
1335
- return context.getElementsByTagName( tag );
1273
+ Expr.find.TAG = function( tag, context ) {
1274
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
1275
+ return context.getElementsByTagName( tag );
1336
1276
 
1337
- // DocumentFragment nodes don't have gEBTN
1338
- } else if ( support.qsa ) {
1339
- return context.querySelectorAll( tag );
1340
- }
1341
- } :
1342
-
1343
- function( tag, context ) {
1344
- var elem,
1345
- tmp = [],
1346
- i = 0,
1347
-
1348
- // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1349
- results = context.getElementsByTagName( tag );
1350
-
1351
- // Filter out possible comments
1352
- if ( tag === "*" ) {
1353
- while ( ( elem = results[ i++ ] ) ) {
1354
- if ( elem.nodeType === 1 ) {
1355
- tmp.push( elem );
1356
- }
1357
- }
1358
-
1359
- return tmp;
1360
- }
1361
- return results;
1362
- };
1277
+ // DocumentFragment nodes don't have gEBTN
1278
+ } else {
1279
+ return context.querySelectorAll( tag );
1280
+ }
1281
+ };
1363
1282
 
1364
1283
  // Class
1365
- Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
1284
+ Expr.find.CLASS = function( className, context ) {
1366
1285
  if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1367
1286
  return context.getElementsByClassName( className );
1368
1287
  }
@@ -1373,195 +1292,94 @@ setDocument = Sizzle.setDocument = function( node ) {
1373
1292
 
1374
1293
  // QSA and matchesSelector support
1375
1294
 
1376
- // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1377
- rbuggyMatches = [];
1378
-
1379
- // qSa(:focus) reports false when true (Chrome 21)
1380
- // We allow this because of a bug in IE8/9 that throws an error
1381
- // whenever `document.activeElement` is accessed on an iframe
1382
- // So, we allow :focus to pass through QSA all the time to avoid the IE error
1383
- // See https://bugs.jquery.com/ticket/13378
1384
1295
  rbuggyQSA = [];
1385
1296
 
1386
- if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
1387
-
1388
- // Build QSA regex
1389
- // Regex strategy adopted from Diego Perini
1390
- assert( function( el ) {
1297
+ // Build QSA regex
1298
+ // Regex strategy adopted from Diego Perini
1299
+ assert( function( el ) {
1391
1300
 
1392
- var input;
1301
+ var input;
1393
1302
 
1394
- // Select is set to empty string on purpose
1395
- // This is to test IE's treatment of not explicitly
1396
- // setting a boolean content attribute,
1397
- // since its presence should be enough
1398
- // https://bugs.jquery.com/ticket/12359
1399
- docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1400
- "<select id='" + expando + "-\r\\' msallowcapture=''>" +
1401
- "<option selected=''></option></select>";
1402
-
1403
- // Support: IE8, Opera 11-12.16
1404
- // Nothing should be selected when empty strings follow ^= or $= or *=
1405
- // The test attribute must be unknown in Opera but "safe" for WinRT
1406
- // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1407
- if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
1408
- rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1409
- }
1303
+ documentElement.appendChild( el ).innerHTML =
1304
+ "<a id='" + expando + "' href='' disabled='disabled'></a>" +
1305
+ "<select id='" + expando + "-\r\\' disabled='disabled'>" +
1306
+ "<option selected=''></option></select>";
1410
1307
 
1411
- // Support: IE8
1412
- // Boolean attributes and "value" are not treated correctly
1413
- if ( !el.querySelectorAll( "[selected]" ).length ) {
1414
- rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1415
- }
1416
-
1417
- // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1418
- if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1419
- rbuggyQSA.push( "~=" );
1420
- }
1421
-
1422
- // Support: IE 11+, Edge 15 - 18+
1423
- // IE 11/Edge don't find elements on a `[name='']` query in some cases.
1424
- // Adding a temporary attribute to the document before the selection works
1425
- // around the issue.
1426
- // Interestingly, IE 10 & older don't seem to have the issue.
1427
- input = document.createElement( "input" );
1428
- input.setAttribute( "name", "" );
1429
- el.appendChild( input );
1430
- if ( !el.querySelectorAll( "[name='']" ).length ) {
1431
- rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
1432
- whitespace + "*(?:''|\"\")" );
1433
- }
1434
-
1435
- // Webkit/Opera - :checked should return selected option elements
1436
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1437
- // IE8 throws error here and will not see later tests
1438
- if ( !el.querySelectorAll( ":checked" ).length ) {
1439
- rbuggyQSA.push( ":checked" );
1440
- }
1441
-
1442
- // Support: Safari 8+, iOS 8+
1443
- // https://bugs.webkit.org/show_bug.cgi?id=136851
1444
- // In-page `selector#id sibling-combinator selector` fails
1445
- if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1446
- rbuggyQSA.push( ".#.+[+~]" );
1447
- }
1448
-
1449
- // Support: Firefox <=3.6 - 5 only
1450
- // Old Firefox doesn't throw on a badly-escaped identifier.
1451
- el.querySelectorAll( "\\\f" );
1452
- rbuggyQSA.push( "[\\r\\n\\f]" );
1453
- } );
1454
-
1455
- assert( function( el ) {
1456
- el.innerHTML = "<a href='' disabled='disabled'></a>" +
1457
- "<select disabled='disabled'><option/></select>";
1458
-
1459
- // Support: Windows 8 Native Apps
1460
- // The type and name attributes are restricted during .innerHTML assignment
1461
- var input = document.createElement( "input" );
1462
- input.setAttribute( "type", "hidden" );
1463
- el.appendChild( input ).setAttribute( "name", "D" );
1464
-
1465
- // Support: IE8
1466
- // Enforce case-sensitivity of name attribute
1467
- if ( el.querySelectorAll( "[name=d]" ).length ) {
1468
- rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1469
- }
1470
-
1471
- // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1472
- // IE8 throws error here and will not see later tests
1473
- if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
1474
- rbuggyQSA.push( ":enabled", ":disabled" );
1475
- }
1476
-
1477
- // Support: IE9-11+
1478
- // IE's :disabled selector does not pick up the children of disabled fieldsets
1479
- docElem.appendChild( el ).disabled = true;
1480
- if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
1481
- rbuggyQSA.push( ":enabled", ":disabled" );
1482
- }
1483
-
1484
- // Support: Opera 10 - 11 only
1485
- // Opera 10-11 does not throw on post-comma invalid pseudos
1486
- el.querySelectorAll( "*,:x" );
1487
- rbuggyQSA.push( ",.*:" );
1488
- } );
1489
- }
1308
+ // Support: iOS <=7 - 8 only
1309
+ // Boolean attributes and "value" are not treated correctly in some XML documents
1310
+ if ( !el.querySelectorAll( "[selected]" ).length ) {
1311
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1312
+ }
1490
1313
 
1491
- if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
1492
- docElem.webkitMatchesSelector ||
1493
- docElem.mozMatchesSelector ||
1494
- docElem.oMatchesSelector ||
1495
- docElem.msMatchesSelector ) ) ) ) {
1314
+ // Support: iOS <=7 - 8 only
1315
+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1316
+ rbuggyQSA.push( "~=" );
1317
+ }
1496
1318
 
1497
- assert( function( el ) {
1319
+ // Support: iOS 8 only
1320
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
1321
+ // In-page `selector#id sibling-combinator selector` fails
1322
+ if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1323
+ rbuggyQSA.push( ".#.+[+~]" );
1324
+ }
1498
1325
 
1499
- // Check to see if it's possible to do matchesSelector
1500
- // on a disconnected node (IE 9)
1501
- support.disconnectedMatch = matches.call( el, "*" );
1326
+ // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
1327
+ // In some of the document kinds, these selectors wouldn't work natively.
1328
+ // This is probably OK but for backwards compatibility we want to maintain
1329
+ // handling them through jQuery traversal in jQuery 3.x.
1330
+ if ( !el.querySelectorAll( ":checked" ).length ) {
1331
+ rbuggyQSA.push( ":checked" );
1332
+ }
1502
1333
 
1503
- // This should fail with an exception
1504
- // Gecko does not error, returns false instead
1505
- matches.call( el, "[s!='']:x" );
1506
- rbuggyMatches.push( "!=", pseudos );
1507
- } );
1508
- }
1334
+ // Support: Windows 8 Native Apps
1335
+ // The type and name attributes are restricted during .innerHTML assignment
1336
+ input = document.createElement( "input" );
1337
+ input.setAttribute( "type", "hidden" );
1338
+ el.appendChild( input ).setAttribute( "name", "D" );
1339
+
1340
+ // Support: IE 9 - 11+
1341
+ // IE's :disabled selector does not pick up the children of disabled fieldsets
1342
+ // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
1343
+ // In some of the document kinds, these selectors wouldn't work natively.
1344
+ // This is probably OK but for backwards compatibility we want to maintain
1345
+ // handling them through jQuery traversal in jQuery 3.x.
1346
+ documentElement.appendChild( el ).disabled = true;
1347
+ if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
1348
+ rbuggyQSA.push( ":enabled", ":disabled" );
1349
+ }
1350
+
1351
+ // Support: IE 11+, Edge 15 - 18+
1352
+ // IE 11/Edge don't find elements on a `[name='']` query in some cases.
1353
+ // Adding a temporary attribute to the document before the selection works
1354
+ // around the issue.
1355
+ // Interestingly, IE 10 & older don't seem to have the issue.
1356
+ input = document.createElement( "input" );
1357
+ input.setAttribute( "name", "" );
1358
+ el.appendChild( input );
1359
+ if ( !el.querySelectorAll( "[name='']" ).length ) {
1360
+ rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
1361
+ whitespace + "*(?:''|\"\")" );
1362
+ }
1363
+ } );
1509
1364
 
1510
- if ( !support.cssSupportsSelector ) {
1365
+ if ( !support.cssHas ) {
1511
1366
 
1512
- // Support: Chrome 105+, Safari 15.4+
1513
- // `:has()` uses a forgiving selector list as an argument so our regular
1514
- // `try-catch` mechanism fails to catch `:has()` with arguments not supported
1515
- // natively like `:has(:contains("Foo"))`. Where supported & spec-compliant,
1516
- // we now use `CSS.supports("selector(:is(SELECTOR_TO_BE_TESTED))")`, but
1517
- // outside that we mark `:has` as buggy.
1367
+ // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+
1368
+ // Our regular `try-catch` mechanism fails to detect natively-unsupported
1369
+ // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`)
1370
+ // in browsers that parse the `:has()` argument as a forgiving selector list.
1371
+ // https://drafts.csswg.org/selectors/#relational now requires the argument
1372
+ // to be parsed unforgivingly, but browsers have not yet fully adjusted.
1518
1373
  rbuggyQSA.push( ":has" );
1519
1374
  }
1520
1375
 
1521
1376
  rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
1522
- rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
1523
-
1524
- /* Contains
1525
- ---------------------------------------------------------------------- */
1526
- hasCompare = rnative.test( docElem.compareDocumentPosition );
1527
-
1528
- // Element contains another
1529
- // Purposefully self-exclusive
1530
- // As in, an element does not contain itself
1531
- contains = hasCompare || rnative.test( docElem.contains ) ?
1532
- function( a, b ) {
1533
-
1534
- // Support: IE <9 only
1535
- // IE doesn't have `contains` on `document` so we need to check for
1536
- // `documentElement` presence.
1537
- // We need to fall back to `a` when `documentElement` is missing
1538
- // as `ownerDocument` of elements within `<template/>` may have
1539
- // a null one - a default behavior of all modern browsers.
1540
- var adown = a.nodeType === 9 && a.documentElement || a,
1541
- bup = b && b.parentNode;
1542
- return a === bup || !!( bup && bup.nodeType === 1 && (
1543
- adown.contains ?
1544
- adown.contains( bup ) :
1545
- a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1546
- ) );
1547
- } :
1548
- function( a, b ) {
1549
- if ( b ) {
1550
- while ( ( b = b.parentNode ) ) {
1551
- if ( b === a ) {
1552
- return true;
1553
- }
1554
- }
1555
- }
1556
- return false;
1557
- };
1558
1377
 
1559
1378
  /* Sorting
1560
1379
  ---------------------------------------------------------------------- */
1561
1380
 
1562
1381
  // Document order sorting
1563
- sortOrder = hasCompare ?
1564
- function( a, b ) {
1382
+ sortOrder = function( a, b ) {
1565
1383
 
1566
1384
  // Flag for duplicate removal
1567
1385
  if ( a === b ) {
@@ -1595,8 +1413,8 @@ setDocument = Sizzle.setDocument = function( node ) {
1595
1413
  // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1596
1414
  // two documents; shallow comparisons work.
1597
1415
  // eslint-disable-next-line eqeqeq
1598
- if ( a == document || a.ownerDocument == preferredDoc &&
1599
- contains( preferredDoc, a ) ) {
1416
+ if ( a === document || a.ownerDocument == preferredDoc &&
1417
+ find.contains( preferredDoc, a ) ) {
1600
1418
  return -1;
1601
1419
  }
1602
1420
 
@@ -1604,100 +1422,33 @@ setDocument = Sizzle.setDocument = function( node ) {
1604
1422
  // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1605
1423
  // two documents; shallow comparisons work.
1606
1424
  // eslint-disable-next-line eqeqeq
1607
- if ( b == document || b.ownerDocument == preferredDoc &&
1608
- contains( preferredDoc, b ) ) {
1425
+ if ( b === document || b.ownerDocument == preferredDoc &&
1426
+ find.contains( preferredDoc, b ) ) {
1609
1427
  return 1;
1610
1428
  }
1611
1429
 
1612
1430
  // Maintain original order
1613
1431
  return sortInput ?
1614
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1432
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1615
1433
  0;
1616
1434
  }
1617
1435
 
1618
1436
  return compare & 4 ? -1 : 1;
1619
- } :
1620
- function( a, b ) {
1621
-
1622
- // Exit early if the nodes are identical
1623
- if ( a === b ) {
1624
- hasDuplicate = true;
1625
- return 0;
1626
- }
1627
-
1628
- var cur,
1629
- i = 0,
1630
- aup = a.parentNode,
1631
- bup = b.parentNode,
1632
- ap = [ a ],
1633
- bp = [ b ];
1634
-
1635
- // Parentless nodes are either documents or disconnected
1636
- if ( !aup || !bup ) {
1637
-
1638
- // Support: IE 11+, Edge 17 - 18+
1639
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1640
- // two documents; shallow comparisons work.
1641
- /* eslint-disable eqeqeq */
1642
- return a == document ? -1 :
1643
- b == document ? 1 :
1644
- /* eslint-enable eqeqeq */
1645
- aup ? -1 :
1646
- bup ? 1 :
1647
- sortInput ?
1648
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1649
- 0;
1650
-
1651
- // If the nodes are siblings, we can do a quick check
1652
- } else if ( aup === bup ) {
1653
- return siblingCheck( a, b );
1654
- }
1655
-
1656
- // Otherwise we need full lists of their ancestors for comparison
1657
- cur = a;
1658
- while ( ( cur = cur.parentNode ) ) {
1659
- ap.unshift( cur );
1660
- }
1661
- cur = b;
1662
- while ( ( cur = cur.parentNode ) ) {
1663
- bp.unshift( cur );
1664
- }
1665
-
1666
- // Walk down the tree looking for a discrepancy
1667
- while ( ap[ i ] === bp[ i ] ) {
1668
- i++;
1669
- }
1670
-
1671
- return i ?
1672
-
1673
- // Do a sibling check if the nodes have a common ancestor
1674
- siblingCheck( ap[ i ], bp[ i ] ) :
1675
-
1676
- // Otherwise nodes in our document sort first
1677
- // Support: IE 11+, Edge 17 - 18+
1678
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1679
- // two documents; shallow comparisons work.
1680
- /* eslint-disable eqeqeq */
1681
- ap[ i ] == preferredDoc ? -1 :
1682
- bp[ i ] == preferredDoc ? 1 :
1683
- /* eslint-enable eqeqeq */
1684
- 0;
1685
1437
  };
1686
1438
 
1687
1439
  return document;
1688
- };
1440
+ }
1689
1441
 
1690
- Sizzle.matches = function( expr, elements ) {
1691
- return Sizzle( expr, null, null, elements );
1442
+ find.matches = function( expr, elements ) {
1443
+ return find( expr, null, null, elements );
1692
1444
  };
1693
1445
 
1694
- Sizzle.matchesSelector = function( elem, expr ) {
1446
+ find.matchesSelector = function( elem, expr ) {
1695
1447
  setDocument( elem );
1696
1448
 
1697
- if ( support.matchesSelector && documentIsHTML &&
1449
+ if ( documentIsHTML &&
1698
1450
  !nonnativeSelectorCache[ expr + " " ] &&
1699
- ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1700
- ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1451
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1701
1452
 
1702
1453
  try {
1703
1454
  var ret = matches.call( elem, expr );
@@ -1705,9 +1456,9 @@ Sizzle.matchesSelector = function( elem, expr ) {
1705
1456
  // IE 9's matchesSelector returns false on disconnected nodes
1706
1457
  if ( ret || support.disconnectedMatch ||
1707
1458
 
1708
- // As well, disconnected nodes are said to be in a document
1709
- // fragment in IE 9
1710
- elem.document && elem.document.nodeType !== 11 ) {
1459
+ // As well, disconnected nodes are said to be in a document
1460
+ // fragment in IE 9
1461
+ elem.document && elem.document.nodeType !== 11 ) {
1711
1462
  return ret;
1712
1463
  }
1713
1464
  } catch ( e ) {
@@ -1715,10 +1466,10 @@ Sizzle.matchesSelector = function( elem, expr ) {
1715
1466
  }
1716
1467
  }
1717
1468
 
1718
- return Sizzle( expr, document, null, [ elem ] ).length > 0;
1469
+ return find( expr, document, null, [ elem ] ).length > 0;
1719
1470
  };
1720
1471
 
1721
- Sizzle.contains = function( context, elem ) {
1472
+ find.contains = function( context, elem ) {
1722
1473
 
1723
1474
  // Set document vars if needed
1724
1475
  // Support: IE 11+, Edge 17 - 18+
@@ -1728,10 +1479,11 @@ Sizzle.contains = function( context, elem ) {
1728
1479
  if ( ( context.ownerDocument || context ) != document ) {
1729
1480
  setDocument( context );
1730
1481
  }
1731
- return contains( context, elem );
1482
+ return jQuery.contains( context, elem );
1732
1483
  };
1733
1484
 
1734
- Sizzle.attr = function( elem, name ) {
1485
+
1486
+ find.attr = function( elem, name ) {
1735
1487
 
1736
1488
  // Set document vars if needed
1737
1489
  // Support: IE 11+, Edge 17 - 18+
@@ -1744,25 +1496,19 @@ Sizzle.attr = function( elem, name ) {
1744
1496
 
1745
1497
  var fn = Expr.attrHandle[ name.toLowerCase() ],
1746
1498
 
1747
- // Don't get fooled by Object.prototype properties (jQuery #13807)
1499
+ // Don't get fooled by Object.prototype properties (see trac-13807)
1748
1500
  val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1749
1501
  fn( elem, name, !documentIsHTML ) :
1750
1502
  undefined;
1751
1503
 
1752
- return val !== undefined ?
1753
- val :
1754
- support.attributes || !documentIsHTML ?
1755
- elem.getAttribute( name ) :
1756
- ( val = elem.getAttributeNode( name ) ) && val.specified ?
1757
- val.value :
1758
- null;
1759
- };
1504
+ if ( val !== undefined ) {
1505
+ return val;
1506
+ }
1760
1507
 
1761
- Sizzle.escape = function( sel ) {
1762
- return ( sel + "" ).replace( rcssescape, fcssescape );
1508
+ return elem.getAttribute( name );
1763
1509
  };
1764
1510
 
1765
- Sizzle.error = function( msg ) {
1511
+ find.error = function( msg ) {
1766
1512
  throw new Error( "Syntax error, unrecognized expression: " + msg );
1767
1513
  };
1768
1514
 
@@ -1770,76 +1516,44 @@ Sizzle.error = function( msg ) {
1770
1516
  * Document sorting and removing duplicates
1771
1517
  * @param {ArrayLike} results
1772
1518
  */
1773
- Sizzle.uniqueSort = function( results ) {
1519
+ jQuery.uniqueSort = function( results ) {
1774
1520
  var elem,
1775
1521
  duplicates = [],
1776
1522
  j = 0,
1777
1523
  i = 0;
1778
1524
 
1779
1525
  // Unless we *know* we can detect duplicates, assume their presence
1780
- hasDuplicate = !support.detectDuplicates;
1781
- sortInput = !support.sortStable && results.slice( 0 );
1782
- results.sort( sortOrder );
1783
-
1784
- if ( hasDuplicate ) {
1785
- while ( ( elem = results[ i++ ] ) ) {
1786
- if ( elem === results[ i ] ) {
1787
- j = duplicates.push( i );
1788
- }
1789
- }
1790
- while ( j-- ) {
1791
- results.splice( duplicates[ j ], 1 );
1792
- }
1793
- }
1794
-
1795
- // Clear input after sorting to release objects
1796
- // See https://github.com/jquery/sizzle/pull/225
1797
- sortInput = null;
1798
-
1799
- return results;
1800
- };
1801
-
1802
- /**
1803
- * Utility function for retrieving the text value of an array of DOM nodes
1804
- * @param {Array|Element} elem
1805
- */
1806
- getText = Sizzle.getText = function( elem ) {
1807
- var node,
1808
- ret = "",
1809
- i = 0,
1810
- nodeType = elem.nodeType;
1811
-
1812
- if ( !nodeType ) {
1813
-
1814
- // If no nodeType, this is expected to be an array
1815
- while ( ( node = elem[ i++ ] ) ) {
1816
-
1817
- // Do not traverse comment nodes
1818
- ret += getText( node );
1819
- }
1820
- } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1821
-
1822
- // Use textContent for elements
1823
- // innerText usage removed for consistency of new lines (jQuery #11153)
1824
- if ( typeof elem.textContent === "string" ) {
1825
- return elem.textContent;
1826
- } else {
1526
+ //
1527
+ // Support: Android <=4.0+
1528
+ // Testing for detecting duplicates is unpredictable so instead assume we can't
1529
+ // depend on duplicate detection in all browsers without a stable sort.
1530
+ hasDuplicate = !support.sortStable;
1531
+ sortInput = !support.sortStable && slice.call( results, 0 );
1532
+ sort.call( results, sortOrder );
1827
1533
 
1828
- // Traverse its children
1829
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1830
- ret += getText( elem );
1534
+ if ( hasDuplicate ) {
1535
+ while ( ( elem = results[ i++ ] ) ) {
1536
+ if ( elem === results[ i ] ) {
1537
+ j = duplicates.push( i );
1831
1538
  }
1832
1539
  }
1833
- } else if ( nodeType === 3 || nodeType === 4 ) {
1834
- return elem.nodeValue;
1540
+ while ( j-- ) {
1541
+ splice.call( results, duplicates[ j ], 1 );
1542
+ }
1835
1543
  }
1836
1544
 
1837
- // Do not include comment or processing instruction nodes
1545
+ // Clear input after sorting to release objects
1546
+ // See https://github.com/jquery/sizzle/pull/225
1547
+ sortInput = null;
1548
+
1549
+ return results;
1550
+ };
1838
1551
 
1839
- return ret;
1552
+ jQuery.fn.uniqueSort = function() {
1553
+ return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );
1840
1554
  };
1841
1555
 
1842
- Expr = Sizzle.selectors = {
1556
+ Expr = jQuery.expr = {
1843
1557
 
1844
1558
  // Can be adjusted by the user
1845
1559
  cacheLength: 50,
@@ -1860,12 +1574,12 @@ Expr = Sizzle.selectors = {
1860
1574
  },
1861
1575
 
1862
1576
  preFilter: {
1863
- "ATTR": function( match ) {
1577
+ ATTR: function( match ) {
1864
1578
  match[ 1 ] = match[ 1 ].replace( runescape, funescape );
1865
1579
 
1866
1580
  // Move the given value to match[3] whether quoted or unquoted
1867
- match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
1868
- match[ 5 ] || "" ).replace( runescape, funescape );
1581
+ match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" )
1582
+ .replace( runescape, funescape );
1869
1583
 
1870
1584
  if ( match[ 2 ] === "~=" ) {
1871
1585
  match[ 3 ] = " " + match[ 3 ] + " ";
@@ -1874,7 +1588,7 @@ Expr = Sizzle.selectors = {
1874
1588
  return match.slice( 0, 4 );
1875
1589
  },
1876
1590
 
1877
- "CHILD": function( match ) {
1591
+ CHILD: function( match ) {
1878
1592
 
1879
1593
  /* matches from matchExpr["CHILD"]
1880
1594
  1 type (only|nth|...)
@@ -1892,29 +1606,30 @@ Expr = Sizzle.selectors = {
1892
1606
 
1893
1607
  // nth-* requires argument
1894
1608
  if ( !match[ 3 ] ) {
1895
- Sizzle.error( match[ 0 ] );
1609
+ find.error( match[ 0 ] );
1896
1610
  }
1897
1611
 
1898
1612
  // numeric x and y parameters for Expr.filter.CHILD
1899
1613
  // remember that false/true cast respectively to 0/1
1900
1614
  match[ 4 ] = +( match[ 4 ] ?
1901
1615
  match[ 5 ] + ( match[ 6 ] || 1 ) :
1902
- 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
1616
+ 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" )
1617
+ );
1903
1618
  match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
1904
1619
 
1905
- // other types prohibit arguments
1620
+ // other types prohibit arguments
1906
1621
  } else if ( match[ 3 ] ) {
1907
- Sizzle.error( match[ 0 ] );
1622
+ find.error( match[ 0 ] );
1908
1623
  }
1909
1624
 
1910
1625
  return match;
1911
1626
  },
1912
1627
 
1913
- "PSEUDO": function( match ) {
1628
+ PSEUDO: function( match ) {
1914
1629
  var excess,
1915
1630
  unquoted = !match[ 6 ] && match[ 2 ];
1916
1631
 
1917
- if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
1632
+ if ( matchExpr.CHILD.test( match[ 0 ] ) ) {
1918
1633
  return null;
1919
1634
  }
1920
1635
 
@@ -1943,36 +1658,36 @@ Expr = Sizzle.selectors = {
1943
1658
 
1944
1659
  filter: {
1945
1660
 
1946
- "TAG": function( nodeNameSelector ) {
1947
- var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1661
+ TAG: function( nodeNameSelector ) {
1662
+ var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1948
1663
  return nodeNameSelector === "*" ?
1949
1664
  function() {
1950
1665
  return true;
1951
1666
  } :
1952
1667
  function( elem ) {
1953
- return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1668
+ return nodeName( elem, expectedNodeName );
1954
1669
  };
1955
1670
  },
1956
1671
 
1957
- "CLASS": function( className ) {
1672
+ CLASS: function( className ) {
1958
1673
  var pattern = classCache[ className + " " ];
1959
1674
 
1960
1675
  return pattern ||
1961
- ( pattern = new RegExp( "(^|" + whitespace +
1962
- ")" + className + "(" + whitespace + "|$)" ) ) && classCache(
1963
- className, function( elem ) {
1964
- return pattern.test(
1965
- typeof elem.className === "string" && elem.className ||
1966
- typeof elem.getAttribute !== "undefined" &&
1967
- elem.getAttribute( "class" ) ||
1968
- ""
1969
- );
1676
+ ( pattern = new RegExp( "(^|" + whitespace + ")" + className +
1677
+ "(" + whitespace + "|$)" ) ) &&
1678
+ classCache( className, function( elem ) {
1679
+ return pattern.test(
1680
+ typeof elem.className === "string" && elem.className ||
1681
+ typeof elem.getAttribute !== "undefined" &&
1682
+ elem.getAttribute( "class" ) ||
1683
+ ""
1684
+ );
1970
1685
  } );
1971
1686
  },
1972
1687
 
1973
- "ATTR": function( name, operator, check ) {
1688
+ ATTR: function( name, operator, check ) {
1974
1689
  return function( elem ) {
1975
- var result = Sizzle.attr( elem, name );
1690
+ var result = find.attr( elem, name );
1976
1691
 
1977
1692
  if ( result == null ) {
1978
1693
  return operator === "!=";
@@ -1983,22 +1698,34 @@ Expr = Sizzle.selectors = {
1983
1698
 
1984
1699
  result += "";
1985
1700
 
1986
- /* eslint-disable max-len */
1987
-
1988
- return operator === "=" ? result === check :
1989
- operator === "!=" ? result !== check :
1990
- operator === "^=" ? check && result.indexOf( check ) === 0 :
1991
- operator === "*=" ? check && result.indexOf( check ) > -1 :
1992
- operator === "$=" ? check && result.slice( -check.length ) === check :
1993
- operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1994
- operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1995
- false;
1996
- /* eslint-enable max-len */
1701
+ if ( operator === "=" ) {
1702
+ return result === check;
1703
+ }
1704
+ if ( operator === "!=" ) {
1705
+ return result !== check;
1706
+ }
1707
+ if ( operator === "^=" ) {
1708
+ return check && result.indexOf( check ) === 0;
1709
+ }
1710
+ if ( operator === "*=" ) {
1711
+ return check && result.indexOf( check ) > -1;
1712
+ }
1713
+ if ( operator === "$=" ) {
1714
+ return check && result.slice( -check.length ) === check;
1715
+ }
1716
+ if ( operator === "~=" ) {
1717
+ return ( " " + result.replace( rwhitespace, " " ) + " " )
1718
+ .indexOf( check ) > -1;
1719
+ }
1720
+ if ( operator === "|=" ) {
1721
+ return result === check || result.slice( 0, check.length + 1 ) === check + "-";
1722
+ }
1997
1723
 
1724
+ return false;
1998
1725
  };
1999
1726
  },
2000
1727
 
2001
- "CHILD": function( type, what, _argument, first, last ) {
1728
+ CHILD: function( type, what, _argument, first, last ) {
2002
1729
  var simple = type.slice( 0, 3 ) !== "nth",
2003
1730
  forward = type.slice( -4 ) !== "last",
2004
1731
  ofType = what === "of-type";
@@ -2011,7 +1738,7 @@ Expr = Sizzle.selectors = {
2011
1738
  } :
2012
1739
 
2013
1740
  function( elem, _context, xml ) {
2014
- var cache, uniqueCache, outerCache, node, nodeIndex, start,
1741
+ var cache, outerCache, node, nodeIndex, start,
2015
1742
  dir = simple !== forward ? "nextSibling" : "previousSibling",
2016
1743
  parent = elem.parentNode,
2017
1744
  name = ofType && elem.nodeName.toLowerCase(),
@@ -2026,7 +1753,7 @@ Expr = Sizzle.selectors = {
2026
1753
  node = elem;
2027
1754
  while ( ( node = node[ dir ] ) ) {
2028
1755
  if ( ofType ?
2029
- node.nodeName.toLowerCase() === name :
1756
+ nodeName( node, name ) :
2030
1757
  node.nodeType === 1 ) {
2031
1758
 
2032
1759
  return false;
@@ -2045,17 +1772,8 @@ Expr = Sizzle.selectors = {
2045
1772
  if ( forward && useCache ) {
2046
1773
 
2047
1774
  // Seek `elem` from a previously-cached index
2048
-
2049
- // ...in a gzip-friendly way
2050
- node = parent;
2051
- outerCache = node[ expando ] || ( node[ expando ] = {} );
2052
-
2053
- // Support: IE <9 only
2054
- // Defend against cloned attroperties (jQuery gh-1709)
2055
- uniqueCache = outerCache[ node.uniqueID ] ||
2056
- ( outerCache[ node.uniqueID ] = {} );
2057
-
2058
- cache = uniqueCache[ type ] || [];
1775
+ outerCache = parent[ expando ] || ( parent[ expando ] = {} );
1776
+ cache = outerCache[ type ] || [];
2059
1777
  nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
2060
1778
  diff = nodeIndex && cache[ 2 ];
2061
1779
  node = nodeIndex && parent.childNodes[ nodeIndex ];
@@ -2067,7 +1785,7 @@ Expr = Sizzle.selectors = {
2067
1785
 
2068
1786
  // When found, cache indexes on `parent` and break
2069
1787
  if ( node.nodeType === 1 && ++diff && node === elem ) {
2070
- uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
1788
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
2071
1789
  break;
2072
1790
  }
2073
1791
  }
@@ -2076,17 +1794,8 @@ Expr = Sizzle.selectors = {
2076
1794
 
2077
1795
  // Use previously-cached element index if available
2078
1796
  if ( useCache ) {
2079
-
2080
- // ...in a gzip-friendly way
2081
- node = elem;
2082
- outerCache = node[ expando ] || ( node[ expando ] = {} );
2083
-
2084
- // Support: IE <9 only
2085
- // Defend against cloned attroperties (jQuery gh-1709)
2086
- uniqueCache = outerCache[ node.uniqueID ] ||
2087
- ( outerCache[ node.uniqueID ] = {} );
2088
-
2089
- cache = uniqueCache[ type ] || [];
1797
+ outerCache = elem[ expando ] || ( elem[ expando ] = {} );
1798
+ cache = outerCache[ type ] || [];
2090
1799
  nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
2091
1800
  diff = nodeIndex;
2092
1801
  }
@@ -2100,7 +1809,7 @@ Expr = Sizzle.selectors = {
2100
1809
  ( diff = nodeIndex = 0 ) || start.pop() ) ) {
2101
1810
 
2102
1811
  if ( ( ofType ?
2103
- node.nodeName.toLowerCase() === name :
1812
+ nodeName( node, name ) :
2104
1813
  node.nodeType === 1 ) &&
2105
1814
  ++diff ) {
2106
1815
 
@@ -2108,13 +1817,7 @@ Expr = Sizzle.selectors = {
2108
1817
  if ( useCache ) {
2109
1818
  outerCache = node[ expando ] ||
2110
1819
  ( node[ expando ] = {} );
2111
-
2112
- // Support: IE <9 only
2113
- // Defend against cloned attroperties (jQuery gh-1709)
2114
- uniqueCache = outerCache[ node.uniqueID ] ||
2115
- ( outerCache[ node.uniqueID ] = {} );
2116
-
2117
- uniqueCache[ type ] = [ dirruns, diff ];
1820
+ outerCache[ type ] = [ dirruns, diff ];
2118
1821
  }
2119
1822
 
2120
1823
  if ( node === elem ) {
@@ -2132,19 +1835,19 @@ Expr = Sizzle.selectors = {
2132
1835
  };
2133
1836
  },
2134
1837
 
2135
- "PSEUDO": function( pseudo, argument ) {
1838
+ PSEUDO: function( pseudo, argument ) {
2136
1839
 
2137
1840
  // pseudo-class names are case-insensitive
2138
- // http://www.w3.org/TR/selectors/#pseudo-classes
1841
+ // https://www.w3.org/TR/selectors/#pseudo-classes
2139
1842
  // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
2140
1843
  // Remember that setFilters inherits from pseudos
2141
1844
  var args,
2142
1845
  fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
2143
- Sizzle.error( "unsupported pseudo: " + pseudo );
1846
+ find.error( "unsupported pseudo: " + pseudo );
2144
1847
 
2145
1848
  // The user may use createPseudo to indicate that
2146
1849
  // arguments are needed to create the filter function
2147
- // just as Sizzle does
1850
+ // just as jQuery does
2148
1851
  if ( fn[ expando ] ) {
2149
1852
  return fn( argument );
2150
1853
  }
@@ -2158,7 +1861,7 @@ Expr = Sizzle.selectors = {
2158
1861
  matched = fn( seed, argument ),
2159
1862
  i = matched.length;
2160
1863
  while ( i-- ) {
2161
- idx = indexOf( seed, matched[ i ] );
1864
+ idx = indexOf.call( seed, matched[ i ] );
2162
1865
  seed[ idx ] = !( matches[ idx ] = matched[ i ] );
2163
1866
  }
2164
1867
  } ) :
@@ -2174,14 +1877,14 @@ Expr = Sizzle.selectors = {
2174
1877
  pseudos: {
2175
1878
 
2176
1879
  // Potentially complex pseudos
2177
- "not": markFunction( function( selector ) {
1880
+ not: markFunction( function( selector ) {
2178
1881
 
2179
1882
  // Trim the selector passed to compile
2180
1883
  // to avoid treating leading and trailing
2181
1884
  // spaces as combinators
2182
1885
  var input = [],
2183
1886
  results = [],
2184
- matcher = compile( selector.replace( rtrim, "$1" ) );
1887
+ matcher = compile( selector.replace( rtrimCSS, "$1" ) );
2185
1888
 
2186
1889
  return matcher[ expando ] ?
2187
1890
  markFunction( function( seed, matches, _context, xml ) {
@@ -2200,22 +1903,23 @@ Expr = Sizzle.selectors = {
2200
1903
  input[ 0 ] = elem;
2201
1904
  matcher( input, null, xml, results );
2202
1905
 
2203
- // Don't keep the element (issue #299)
1906
+ // Don't keep the element
1907
+ // (see https://github.com/jquery/sizzle/issues/299)
2204
1908
  input[ 0 ] = null;
2205
1909
  return !results.pop();
2206
1910
  };
2207
1911
  } ),
2208
1912
 
2209
- "has": markFunction( function( selector ) {
1913
+ has: markFunction( function( selector ) {
2210
1914
  return function( elem ) {
2211
- return Sizzle( selector, elem ).length > 0;
1915
+ return find( selector, elem ).length > 0;
2212
1916
  };
2213
1917
  } ),
2214
1918
 
2215
- "contains": markFunction( function( text ) {
1919
+ contains: markFunction( function( text ) {
2216
1920
  text = text.replace( runescape, funescape );
2217
1921
  return function( elem ) {
2218
- return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
1922
+ return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;
2219
1923
  };
2220
1924
  } ),
2221
1925
 
@@ -2225,12 +1929,12 @@ Expr = Sizzle.selectors = {
2225
1929
  // or beginning with the identifier C immediately followed by "-".
2226
1930
  // The matching of C against the element's language value is performed case-insensitively.
2227
1931
  // The identifier C does not have to be a valid language name."
2228
- // http://www.w3.org/TR/selectors/#lang-pseudo
2229
- "lang": markFunction( function( lang ) {
1932
+ // https://www.w3.org/TR/selectors/#lang-pseudo
1933
+ lang: markFunction( function( lang ) {
2230
1934
 
2231
1935
  // lang value must be a valid identifier
2232
1936
  if ( !ridentifier.test( lang || "" ) ) {
2233
- Sizzle.error( "unsupported lang: " + lang );
1937
+ find.error( "unsupported lang: " + lang );
2234
1938
  }
2235
1939
  lang = lang.replace( runescape, funescape ).toLowerCase();
2236
1940
  return function( elem ) {
@@ -2249,38 +1953,39 @@ Expr = Sizzle.selectors = {
2249
1953
  } ),
2250
1954
 
2251
1955
  // Miscellaneous
2252
- "target": function( elem ) {
1956
+ target: function( elem ) {
2253
1957
  var hash = window.location && window.location.hash;
2254
1958
  return hash && hash.slice( 1 ) === elem.id;
2255
1959
  },
2256
1960
 
2257
- "root": function( elem ) {
2258
- return elem === docElem;
1961
+ root: function( elem ) {
1962
+ return elem === documentElement;
2259
1963
  },
2260
1964
 
2261
- "focus": function( elem ) {
2262
- return elem === document.activeElement &&
2263
- ( !document.hasFocus || document.hasFocus() ) &&
1965
+ focus: function( elem ) {
1966
+ return elem === safeActiveElement() &&
1967
+ document.hasFocus() &&
2264
1968
  !!( elem.type || elem.href || ~elem.tabIndex );
2265
1969
  },
2266
1970
 
2267
1971
  // Boolean properties
2268
- "enabled": createDisabledPseudo( false ),
2269
- "disabled": createDisabledPseudo( true ),
1972
+ enabled: createDisabledPseudo( false ),
1973
+ disabled: createDisabledPseudo( true ),
2270
1974
 
2271
- "checked": function( elem ) {
1975
+ checked: function( elem ) {
2272
1976
 
2273
1977
  // In CSS3, :checked should return both checked and selected elements
2274
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2275
- var nodeName = elem.nodeName.toLowerCase();
2276
- return ( nodeName === "input" && !!elem.checked ) ||
2277
- ( nodeName === "option" && !!elem.selected );
1978
+ // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1979
+ return ( nodeName( elem, "input" ) && !!elem.checked ) ||
1980
+ ( nodeName( elem, "option" ) && !!elem.selected );
2278
1981
  },
2279
1982
 
2280
- "selected": function( elem ) {
1983
+ selected: function( elem ) {
2281
1984
 
2282
- // Accessing this property makes selected-by-default
2283
- // options in Safari work properly
1985
+ // Support: IE <=11+
1986
+ // Accessing the selectedIndex property
1987
+ // forces the browser to treat the default option as
1988
+ // selected when in an optgroup.
2284
1989
  if ( elem.parentNode ) {
2285
1990
  // eslint-disable-next-line no-unused-expressions
2286
1991
  elem.parentNode.selectedIndex;
@@ -2290,9 +1995,9 @@ Expr = Sizzle.selectors = {
2290
1995
  },
2291
1996
 
2292
1997
  // Contents
2293
- "empty": function( elem ) {
1998
+ empty: function( elem ) {
2294
1999
 
2295
- // http://www.w3.org/TR/selectors/#empty-pseudo
2000
+ // https://www.w3.org/TR/selectors/#empty-pseudo
2296
2001
  // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2297
2002
  // but not by others (comment: 8; processing instruction: 7; etc.)
2298
2003
  // nodeType < 6 works because attributes (2) do not appear as children
@@ -2304,49 +2009,49 @@ Expr = Sizzle.selectors = {
2304
2009
  return true;
2305
2010
  },
2306
2011
 
2307
- "parent": function( elem ) {
2308
- return !Expr.pseudos[ "empty" ]( elem );
2012
+ parent: function( elem ) {
2013
+ return !Expr.pseudos.empty( elem );
2309
2014
  },
2310
2015
 
2311
2016
  // Element/input types
2312
- "header": function( elem ) {
2017
+ header: function( elem ) {
2313
2018
  return rheader.test( elem.nodeName );
2314
2019
  },
2315
2020
 
2316
- "input": function( elem ) {
2021
+ input: function( elem ) {
2317
2022
  return rinputs.test( elem.nodeName );
2318
2023
  },
2319
2024
 
2320
- "button": function( elem ) {
2321
- var name = elem.nodeName.toLowerCase();
2322
- return name === "input" && elem.type === "button" || name === "button";
2025
+ button: function( elem ) {
2026
+ return nodeName( elem, "input" ) && elem.type === "button" ||
2027
+ nodeName( elem, "button" );
2323
2028
  },
2324
2029
 
2325
- "text": function( elem ) {
2030
+ text: function( elem ) {
2326
2031
  var attr;
2327
- return elem.nodeName.toLowerCase() === "input" &&
2328
- elem.type === "text" &&
2032
+ return nodeName( elem, "input" ) && elem.type === "text" &&
2329
2033
 
2330
2034
  // Support: IE <10 only
2331
- // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2035
+ // New HTML5 attribute values (e.g., "search") appear
2036
+ // with elem.type === "text"
2332
2037
  ( ( attr = elem.getAttribute( "type" ) ) == null ||
2333
2038
  attr.toLowerCase() === "text" );
2334
2039
  },
2335
2040
 
2336
2041
  // Position-in-collection
2337
- "first": createPositionalPseudo( function() {
2042
+ first: createPositionalPseudo( function() {
2338
2043
  return [ 0 ];
2339
2044
  } ),
2340
2045
 
2341
- "last": createPositionalPseudo( function( _matchIndexes, length ) {
2046
+ last: createPositionalPseudo( function( _matchIndexes, length ) {
2342
2047
  return [ length - 1 ];
2343
2048
  } ),
2344
2049
 
2345
- "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
2050
+ eq: createPositionalPseudo( function( _matchIndexes, length, argument ) {
2346
2051
  return [ argument < 0 ? argument + length : argument ];
2347
2052
  } ),
2348
2053
 
2349
- "even": createPositionalPseudo( function( matchIndexes, length ) {
2054
+ even: createPositionalPseudo( function( matchIndexes, length ) {
2350
2055
  var i = 0;
2351
2056
  for ( ; i < length; i += 2 ) {
2352
2057
  matchIndexes.push( i );
@@ -2354,7 +2059,7 @@ Expr = Sizzle.selectors = {
2354
2059
  return matchIndexes;
2355
2060
  } ),
2356
2061
 
2357
- "odd": createPositionalPseudo( function( matchIndexes, length ) {
2062
+ odd: createPositionalPseudo( function( matchIndexes, length ) {
2358
2063
  var i = 1;
2359
2064
  for ( ; i < length; i += 2 ) {
2360
2065
  matchIndexes.push( i );
@@ -2362,19 +2067,24 @@ Expr = Sizzle.selectors = {
2362
2067
  return matchIndexes;
2363
2068
  } ),
2364
2069
 
2365
- "lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2366
- var i = argument < 0 ?
2367
- argument + length :
2368
- argument > length ?
2369
- length :
2370
- argument;
2070
+ lt: createPositionalPseudo( function( matchIndexes, length, argument ) {
2071
+ var i;
2072
+
2073
+ if ( argument < 0 ) {
2074
+ i = argument + length;
2075
+ } else if ( argument > length ) {
2076
+ i = length;
2077
+ } else {
2078
+ i = argument;
2079
+ }
2080
+
2371
2081
  for ( ; --i >= 0; ) {
2372
2082
  matchIndexes.push( i );
2373
2083
  }
2374
2084
  return matchIndexes;
2375
2085
  } ),
2376
2086
 
2377
- "gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2087
+ gt: createPositionalPseudo( function( matchIndexes, length, argument ) {
2378
2088
  var i = argument < 0 ? argument + length : argument;
2379
2089
  for ( ; ++i < length; ) {
2380
2090
  matchIndexes.push( i );
@@ -2384,7 +2094,7 @@ Expr = Sizzle.selectors = {
2384
2094
  }
2385
2095
  };
2386
2096
 
2387
- Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
2097
+ Expr.pseudos.nth = Expr.pseudos.eq;
2388
2098
 
2389
2099
  // Add button/input type pseudos
2390
2100
  for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
@@ -2399,7 +2109,7 @@ function setFilters() {}
2399
2109
  setFilters.prototype = Expr.filters = Expr.pseudos;
2400
2110
  Expr.setFilters = new setFilters();
2401
2111
 
2402
- tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2112
+ function tokenize( selector, parseOnly ) {
2403
2113
  var matched, match, tokens, type,
2404
2114
  soFar, groups, preFilters,
2405
2115
  cached = tokenCache[ selector + " " ];
@@ -2427,13 +2137,13 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2427
2137
  matched = false;
2428
2138
 
2429
2139
  // Combinators
2430
- if ( ( match = rcombinators.exec( soFar ) ) ) {
2140
+ if ( ( match = rleadingCombinator.exec( soFar ) ) ) {
2431
2141
  matched = match.shift();
2432
2142
  tokens.push( {
2433
2143
  value: matched,
2434
2144
 
2435
2145
  // Cast descendant combinators to space
2436
- type: match[ 0 ].replace( rtrim, " " )
2146
+ type: match[ 0 ].replace( rtrimCSS, " " )
2437
2147
  } );
2438
2148
  soFar = soFar.slice( matched.length );
2439
2149
  }
@@ -2460,14 +2170,16 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2460
2170
  // Return the length of the invalid excess
2461
2171
  // if we're just parsing
2462
2172
  // Otherwise, throw an error or return tokens
2463
- return parseOnly ?
2464
- soFar.length :
2465
- soFar ?
2466
- Sizzle.error( selector ) :
2173
+ if ( parseOnly ) {
2174
+ return soFar.length;
2175
+ }
2467
2176
 
2468
- // Cache the tokens
2469
- tokenCache( selector, groups ).slice( 0 );
2470
- };
2177
+ return soFar ?
2178
+ find.error( selector ) :
2179
+
2180
+ // Cache the tokens
2181
+ tokenCache( selector, groups ).slice( 0 );
2182
+ }
2471
2183
 
2472
2184
  function toSelector( tokens ) {
2473
2185
  var i = 0,
@@ -2500,7 +2212,7 @@ function addCombinator( matcher, combinator, base ) {
2500
2212
 
2501
2213
  // Check against all ancestor/preceding elements
2502
2214
  function( elem, context, xml ) {
2503
- var oldCache, uniqueCache, outerCache,
2215
+ var oldCache, outerCache,
2504
2216
  newCache = [ dirruns, doneName ];
2505
2217
 
2506
2218
  // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
@@ -2517,14 +2229,9 @@ function addCombinator( matcher, combinator, base ) {
2517
2229
  if ( elem.nodeType === 1 || checkNonElements ) {
2518
2230
  outerCache = elem[ expando ] || ( elem[ expando ] = {} );
2519
2231
 
2520
- // Support: IE <9 only
2521
- // Defend against cloned attroperties (jQuery gh-1709)
2522
- uniqueCache = outerCache[ elem.uniqueID ] ||
2523
- ( outerCache[ elem.uniqueID ] = {} );
2524
-
2525
- if ( skip && skip === elem.nodeName.toLowerCase() ) {
2232
+ if ( skip && nodeName( elem, skip ) ) {
2526
2233
  elem = elem[ dir ] || elem;
2527
- } else if ( ( oldCache = uniqueCache[ key ] ) &&
2234
+ } else if ( ( oldCache = outerCache[ key ] ) &&
2528
2235
  oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2529
2236
 
2530
2237
  // Assign to newCache so results back-propagate to previous elements
@@ -2532,7 +2239,7 @@ function addCombinator( matcher, combinator, base ) {
2532
2239
  } else {
2533
2240
 
2534
2241
  // Reuse newcache so results back-propagate to previous elements
2535
- uniqueCache[ key ] = newCache;
2242
+ outerCache[ key ] = newCache;
2536
2243
 
2537
2244
  // A match means we're done; a fail means we have to keep checking
2538
2245
  if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
@@ -2564,7 +2271,7 @@ function multipleContexts( selector, contexts, results ) {
2564
2271
  var i = 0,
2565
2272
  len = contexts.length;
2566
2273
  for ( ; i < len; i++ ) {
2567
- Sizzle( selector, contexts[ i ], results );
2274
+ find( selector, contexts[ i ], results );
2568
2275
  }
2569
2276
  return results;
2570
2277
  }
@@ -2598,38 +2305,37 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2598
2305
  postFinder = setMatcher( postFinder, postSelector );
2599
2306
  }
2600
2307
  return markFunction( function( seed, results, context, xml ) {
2601
- var temp, i, elem,
2308
+ var temp, i, elem, matcherOut,
2602
2309
  preMap = [],
2603
2310
  postMap = [],
2604
2311
  preexisting = results.length,
2605
2312
 
2606
2313
  // Get initial elements from seed or context
2607
- elems = seed || multipleContexts(
2608
- selector || "*",
2609
- context.nodeType ? [ context ] : context,
2610
- []
2611
- ),
2314
+ elems = seed ||
2315
+ multipleContexts( selector || "*",
2316
+ context.nodeType ? [ context ] : context, [] ),
2612
2317
 
2613
2318
  // Prefilter to get matcher input, preserving a map for seed-results synchronization
2614
2319
  matcherIn = preFilter && ( seed || !selector ) ?
2615
2320
  condense( elems, preMap, preFilter, context, xml ) :
2616
- elems,
2321
+ elems;
2617
2322
 
2618
- matcherOut = matcher ?
2323
+ if ( matcher ) {
2619
2324
 
2620
- // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2621
- postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2325
+ // If we have a postFinder, or filtered seed, or non-seed postFilter
2326
+ // or preexisting results,
2327
+ matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2622
2328
 
2623
- // ...intermediate processing is necessary
2624
- [] :
2329
+ // ...intermediate processing is necessary
2330
+ [] :
2625
2331
 
2626
- // ...otherwise use results directly
2627
- results :
2628
- matcherIn;
2332
+ // ...otherwise use results directly
2333
+ results;
2629
2334
 
2630
- // Find primary matches
2631
- if ( matcher ) {
2335
+ // Find primary matches
2632
2336
  matcher( matcherIn, matcherOut, context, xml );
2337
+ } else {
2338
+ matcherOut = matcherIn;
2633
2339
  }
2634
2340
 
2635
2341
  // Apply postFilter
@@ -2667,7 +2373,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2667
2373
  i = matcherOut.length;
2668
2374
  while ( i-- ) {
2669
2375
  if ( ( elem = matcherOut[ i ] ) &&
2670
- ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
2376
+ ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {
2671
2377
 
2672
2378
  seed[ temp ] = !( results[ temp ] = elem );
2673
2379
  }
@@ -2702,15 +2408,21 @@ function matcherFromTokens( tokens ) {
2702
2408
  return elem === checkContext;
2703
2409
  }, implicitRelative, true ),
2704
2410
  matchAnyContext = addCombinator( function( elem ) {
2705
- return indexOf( checkContext, elem ) > -1;
2411
+ return indexOf.call( checkContext, elem ) > -1;
2706
2412
  }, implicitRelative, true ),
2707
2413
  matchers = [ function( elem, context, xml ) {
2708
- var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2414
+
2415
+ // Support: IE 11+, Edge 17 - 18+
2416
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2417
+ // two documents; shallow comparisons work.
2418
+ // eslint-disable-next-line eqeqeq
2419
+ var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (
2709
2420
  ( checkContext = context ).nodeType ?
2710
2421
  matchContext( elem, context, xml ) :
2711
2422
  matchAnyContext( elem, context, xml ) );
2712
2423
 
2713
- // Avoid hanging onto element (issue #299)
2424
+ // Avoid hanging onto element
2425
+ // (see https://github.com/jquery/sizzle/issues/299)
2714
2426
  checkContext = null;
2715
2427
  return ret;
2716
2428
  } ];
@@ -2735,11 +2447,10 @@ function matcherFromTokens( tokens ) {
2735
2447
  i > 1 && elementMatcher( matchers ),
2736
2448
  i > 1 && toSelector(
2737
2449
 
2738
- // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2739
- tokens
2740
- .slice( 0, i - 1 )
2741
- .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
2742
- ).replace( rtrim, "$1" ),
2450
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2451
+ tokens.slice( 0, i - 1 )
2452
+ .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
2453
+ ).replace( rtrimCSS, "$1" ),
2743
2454
  matcher,
2744
2455
  i < j && matcherFromTokens( tokens.slice( i, j ) ),
2745
2456
  j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
@@ -2765,7 +2476,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2765
2476
  contextBackup = outermostContext,
2766
2477
 
2767
2478
  // We must always have either seed elements or outermost context
2768
- elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
2479
+ elems = seed || byElement && Expr.find.TAG( "*", outermost ),
2769
2480
 
2770
2481
  // Use integer dirruns iff this is the outermost matcher
2771
2482
  dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
@@ -2781,8 +2492,9 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2781
2492
  }
2782
2493
 
2783
2494
  // Add elements passing elementMatchers directly to results
2784
- // Support: IE<9, Safari
2785
- // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2495
+ // Support: iOS <=7 - 9 only
2496
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching
2497
+ // elements by id. (see trac-14142)
2786
2498
  for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
2787
2499
  if ( byElement && elem ) {
2788
2500
  j = 0;
@@ -2797,7 +2509,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2797
2509
  }
2798
2510
  while ( ( matcher = elementMatchers[ j++ ] ) ) {
2799
2511
  if ( matcher( elem, context || document, xml ) ) {
2800
- results.push( elem );
2512
+ push.call( results, elem );
2801
2513
  break;
2802
2514
  }
2803
2515
  }
@@ -2860,7 +2572,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2860
2572
  if ( outermost && !seed && setMatched.length > 0 &&
2861
2573
  ( matchedCount + setMatchers.length ) > 1 ) {
2862
2574
 
2863
- Sizzle.uniqueSort( results );
2575
+ jQuery.uniqueSort( results );
2864
2576
  }
2865
2577
  }
2866
2578
 
@@ -2878,7 +2590,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2878
2590
  superMatcher;
2879
2591
  }
2880
2592
 
2881
- compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2593
+ function compile( selector, match /* Internal Use Only */ ) {
2882
2594
  var i,
2883
2595
  setMatchers = [],
2884
2596
  elementMatchers = [],
@@ -2901,27 +2613,25 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2901
2613
  }
2902
2614
 
2903
2615
  // Cache the compiled function
2904
- cached = compilerCache(
2905
- selector,
2906
- matcherFromGroupMatchers( elementMatchers, setMatchers )
2907
- );
2616
+ cached = compilerCache( selector,
2617
+ matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2908
2618
 
2909
2619
  // Save selector and tokenization
2910
2620
  cached.selector = selector;
2911
2621
  }
2912
2622
  return cached;
2913
- };
2623
+ }
2914
2624
 
2915
2625
  /**
2916
- * A low-level selection function that works with Sizzle's compiled
2626
+ * A low-level selection function that works with jQuery's compiled
2917
2627
  * selector functions
2918
2628
  * @param {String|Function} selector A selector or a pre-compiled
2919
- * selector function built with Sizzle.compile
2629
+ * selector function built with jQuery selector compile
2920
2630
  * @param {Element} context
2921
2631
  * @param {Array} [results]
2922
2632
  * @param {Array} [seed] A set of elements to match against
2923
2633
  */
2924
- select = Sizzle.select = function( selector, context, results, seed ) {
2634
+ function select( selector, context, results, seed ) {
2925
2635
  var i, tokens, token, type, find,
2926
2636
  compiled = typeof selector === "function" && selector,
2927
2637
  match = !seed && tokenize( ( selector = compiled.selector || selector ) );
@@ -2935,10 +2645,12 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2935
2645
  // Reduce context if the leading compound selector is an ID
2936
2646
  tokens = match[ 0 ] = match[ 0 ].slice( 0 );
2937
2647
  if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
2938
- context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
2648
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
2939
2649
 
2940
- context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
2941
- .replace( runescape, funescape ), context ) || [] )[ 0 ];
2650
+ context = ( Expr.find.ID(
2651
+ token.matches[ 0 ].replace( runescape, funescape ),
2652
+ context
2653
+ ) || [] )[ 0 ];
2942
2654
  if ( !context ) {
2943
2655
  return results;
2944
2656
 
@@ -2951,7 +2663,7 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2951
2663
  }
2952
2664
 
2953
2665
  // Fetch a seed set for right-to-left matching
2954
- i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
2666
+ i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;
2955
2667
  while ( i-- ) {
2956
2668
  token = tokens[ i ];
2957
2669
 
@@ -2964,8 +2676,8 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2964
2676
  // Search, expanding context for leading sibling combinators
2965
2677
  if ( ( seed = find(
2966
2678
  token.matches[ 0 ].replace( runescape, funescape ),
2967
- rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
2968
- context
2679
+ rsibling.test( tokens[ 0 ].type ) &&
2680
+ testContext( context.parentNode ) || context
2969
2681
  ) ) ) {
2970
2682
 
2971
2683
  // If seed is empty or no tokens remain, we can return early
@@ -2992,21 +2704,18 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2992
2704
  !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2993
2705
  );
2994
2706
  return results;
2995
- };
2707
+ }
2996
2708
 
2997
2709
  // One-time assignments
2998
2710
 
2711
+ // Support: Android <=4.0 - 4.1+
2999
2712
  // Sort stability
3000
2713
  support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
3001
2714
 
3002
- // Support: Chrome 14-35+
3003
- // Always assume duplicates if they aren't passed to the comparison function
3004
- support.detectDuplicates = !!hasDuplicate;
3005
-
3006
2715
  // Initialize against the default document
3007
2716
  setDocument();
3008
2717
 
3009
- // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2718
+ // Support: Android <=4.0 - 4.1+
3010
2719
  // Detached nodes confoundingly follow *each other*
3011
2720
  support.sortDetached = assert( function( el ) {
3012
2721
 
@@ -3014,68 +2723,29 @@ support.sortDetached = assert( function( el ) {
3014
2723
  return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
3015
2724
  } );
3016
2725
 
3017
- // Support: IE<8
3018
- // Prevent attribute/property "interpolation"
3019
- // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
3020
- if ( !assert( function( el ) {
3021
- el.innerHTML = "<a href='#'></a>";
3022
- return el.firstChild.getAttribute( "href" ) === "#";
3023
- } ) ) {
3024
- addHandle( "type|href|height|width", function( elem, name, isXML ) {
3025
- if ( !isXML ) {
3026
- return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
3027
- }
3028
- } );
3029
- }
3030
-
3031
- // Support: IE<9
3032
- // Use defaultValue in place of getAttribute("value")
3033
- if ( !support.attributes || !assert( function( el ) {
3034
- el.innerHTML = "<input/>";
3035
- el.firstChild.setAttribute( "value", "" );
3036
- return el.firstChild.getAttribute( "value" ) === "";
3037
- } ) ) {
3038
- addHandle( "value", function( elem, _name, isXML ) {
3039
- if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
3040
- return elem.defaultValue;
3041
- }
3042
- } );
3043
- }
3044
-
3045
- // Support: IE<9
3046
- // Use getAttributeNode to fetch booleans when getAttribute lies
3047
- if ( !assert( function( el ) {
3048
- return el.getAttribute( "disabled" ) == null;
3049
- } ) ) {
3050
- addHandle( booleans, function( elem, name, isXML ) {
3051
- var val;
3052
- if ( !isXML ) {
3053
- return elem[ name ] === true ? name.toLowerCase() :
3054
- ( val = elem.getAttributeNode( name ) ) && val.specified ?
3055
- val.value :
3056
- null;
3057
- }
3058
- } );
3059
- }
3060
-
3061
- return Sizzle;
3062
-
3063
- } )( window );
3064
-
3065
-
3066
-
3067
- jQuery.find = Sizzle;
3068
- jQuery.expr = Sizzle.selectors;
2726
+ jQuery.find = find;
3069
2727
 
3070
2728
  // Deprecated
3071
2729
  jQuery.expr[ ":" ] = jQuery.expr.pseudos;
3072
- jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
3073
- jQuery.text = Sizzle.getText;
3074
- jQuery.isXMLDoc = Sizzle.isXML;
3075
- jQuery.contains = Sizzle.contains;
3076
- jQuery.escapeSelector = Sizzle.escape;
2730
+ jQuery.unique = jQuery.uniqueSort;
2731
+
2732
+ // These have always been private, but they used to be documented
2733
+ // as part of Sizzle so let's maintain them in the 3.x line
2734
+ // for backwards compatibility purposes.
2735
+ find.compile = compile;
2736
+ find.select = select;
2737
+ find.setDocument = setDocument;
3077
2738
 
2739
+ find.escape = jQuery.escapeSelector;
2740
+ find.getText = jQuery.text;
2741
+ find.isXML = jQuery.isXMLDoc;
2742
+ find.selectors = jQuery.expr;
2743
+ find.support = jQuery.support;
2744
+ find.uniqueSort = jQuery.uniqueSort;
3078
2745
 
2746
+ /* eslint-enable */
2747
+
2748
+ } )();
3079
2749
 
3080
2750
 
3081
2751
  var dir = function( elem, dir, until ) {
@@ -3109,13 +2779,6 @@ var siblings = function( n, elem ) {
3109
2779
 
3110
2780
  var rneedsContext = jQuery.expr.match.needsContext;
3111
2781
 
3112
-
3113
-
3114
- function nodeName( elem, name ) {
3115
-
3116
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
3117
-
3118
- }
3119
2782
  var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
3120
2783
 
3121
2784
 
@@ -3366,7 +3029,7 @@ jQuery.fn.extend( {
3366
3029
  if ( cur.nodeType < 11 && ( targets ?
3367
3030
  targets.index( cur ) > -1 :
3368
3031
 
3369
- // Don't pass non-elements to Sizzle
3032
+ // Don't pass non-elements to jQuery#find
3370
3033
  cur.nodeType === 1 &&
3371
3034
  jQuery.find.matchesSelector( cur, selectors ) ) ) {
3372
3035
 
@@ -3921,7 +3584,7 @@ jQuery.extend( {
3921
3584
 
3922
3585
  if ( jQuery.Deferred.exceptionHook ) {
3923
3586
  jQuery.Deferred.exceptionHook( e,
3924
- process.stackTrace );
3587
+ process.error );
3925
3588
  }
3926
3589
 
3927
3590
  // Support: Promises/A+ section 2.3.3.3.4.1
@@ -3949,10 +3612,17 @@ jQuery.extend( {
3949
3612
  process();
3950
3613
  } else {
3951
3614
 
3952
- // Call an optional hook to record the stack, in case of exception
3615
+ // Call an optional hook to record the error, in case of exception
3953
3616
  // since it's otherwise lost when execution goes async
3954
- if ( jQuery.Deferred.getStackHook ) {
3955
- process.stackTrace = jQuery.Deferred.getStackHook();
3617
+ if ( jQuery.Deferred.getErrorHook ) {
3618
+ process.error = jQuery.Deferred.getErrorHook();
3619
+
3620
+ // The deprecated alias of the above. While the name suggests
3621
+ // returning the stack, not an error instance, jQuery just passes
3622
+ // it directly to `console.warn` so both will work; an instance
3623
+ // just better cooperates with source maps.
3624
+ } else if ( jQuery.Deferred.getStackHook ) {
3625
+ process.error = jQuery.Deferred.getStackHook();
3956
3626
  }
3957
3627
  window.setTimeout( process );
3958
3628
  }
@@ -4127,12 +3797,16 @@ jQuery.extend( {
4127
3797
  // warn about them ASAP rather than swallowing them by default.
4128
3798
  var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
4129
3799
 
4130
- jQuery.Deferred.exceptionHook = function( error, stack ) {
3800
+ // If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error
3801
+ // captured before the async barrier to get the original error cause
3802
+ // which may otherwise be hidden.
3803
+ jQuery.Deferred.exceptionHook = function( error, asyncError ) {
4131
3804
 
4132
3805
  // Support: IE 8 - 9 only
4133
3806
  // Console exists when dev tools are open, which can happen at any time
4134
3807
  if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
4135
- window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
3808
+ window.console.warn( "jQuery.Deferred exception: " + error.message,
3809
+ error.stack, asyncError );
4136
3810
  }
4137
3811
  };
4138
3812
 
@@ -5188,25 +4862,6 @@ function returnFalse() {
5188
4862
  return false;
5189
4863
  }
5190
4864
 
5191
- // Support: IE <=9 - 11+
5192
- // focus() and blur() are asynchronous, except when they are no-op.
5193
- // So expect focus to be synchronous when the element is already active,
5194
- // and blur to be synchronous when the element is not already active.
5195
- // (focus and blur are always synchronous in other supported browsers,
5196
- // this just defines when we can count on it).
5197
- function expectSync( elem, type ) {
5198
- return ( elem === safeActiveElement() ) === ( type === "focus" );
5199
- }
5200
-
5201
- // Support: IE <=9 only
5202
- // Accessing document.activeElement can throw unexpectedly
5203
- // https://bugs.jquery.com/ticket/13393
5204
- function safeActiveElement() {
5205
- try {
5206
- return document.activeElement;
5207
- } catch ( err ) { }
5208
- }
5209
-
5210
4865
  function on( elem, types, selector, data, fn, one ) {
5211
4866
  var origFn, type;
5212
4867
 
@@ -5644,7 +5299,7 @@ jQuery.event = {
5644
5299
  el.click && nodeName( el, "input" ) ) {
5645
5300
 
5646
5301
  // dataPriv.set( el, "click", ... )
5647
- leverageNative( el, "click", returnTrue );
5302
+ leverageNative( el, "click", true );
5648
5303
  }
5649
5304
 
5650
5305
  // Return false to allow normal processing in the caller
@@ -5695,10 +5350,10 @@ jQuery.event = {
5695
5350
  // synthetic events by interrupting progress until reinvoked in response to
5696
5351
  // *native* events that it fires directly, ensuring that state changes have
5697
5352
  // already occurred before other listeners are invoked.
5698
- function leverageNative( el, type, expectSync ) {
5353
+ function leverageNative( el, type, isSetup ) {
5699
5354
 
5700
- // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
5701
- if ( !expectSync ) {
5355
+ // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add
5356
+ if ( !isSetup ) {
5702
5357
  if ( dataPriv.get( el, type ) === undefined ) {
5703
5358
  jQuery.event.add( el, type, returnTrue );
5704
5359
  }
@@ -5710,15 +5365,13 @@ function leverageNative( el, type, expectSync ) {
5710
5365
  jQuery.event.add( el, type, {
5711
5366
  namespace: false,
5712
5367
  handler: function( event ) {
5713
- var notAsync, result,
5368
+ var result,
5714
5369
  saved = dataPriv.get( this, type );
5715
5370
 
5716
5371
  if ( ( event.isTrigger & 1 ) && this[ type ] ) {
5717
5372
 
5718
5373
  // Interrupt processing of the outer synthetic .trigger()ed event
5719
- // Saved data should be false in such cases, but might be a leftover capture object
5720
- // from an async native handler (gh-4350)
5721
- if ( !saved.length ) {
5374
+ if ( !saved ) {
5722
5375
 
5723
5376
  // Store arguments for use when handling the inner native event
5724
5377
  // There will always be at least one argument (an event object), so this array
@@ -5727,33 +5380,22 @@ function leverageNative( el, type, expectSync ) {
5727
5380
  dataPriv.set( this, type, saved );
5728
5381
 
5729
5382
  // Trigger the native event and capture its result
5730
- // Support: IE <=9 - 11+
5731
- // focus() and blur() are asynchronous
5732
- notAsync = expectSync( this, type );
5733
5383
  this[ type ]();
5734
5384
  result = dataPriv.get( this, type );
5735
- if ( saved !== result || notAsync ) {
5736
- dataPriv.set( this, type, false );
5737
- } else {
5738
- result = {};
5739
- }
5385
+ dataPriv.set( this, type, false );
5386
+
5740
5387
  if ( saved !== result ) {
5741
5388
 
5742
5389
  // Cancel the outer synthetic event
5743
5390
  event.stopImmediatePropagation();
5744
5391
  event.preventDefault();
5745
5392
 
5746
- // Support: Chrome 86+
5747
- // In Chrome, if an element having a focusout handler is blurred by
5748
- // clicking outside of it, it invokes the handler synchronously. If
5749
- // that handler calls `.remove()` on the element, the data is cleared,
5750
- // leaving `result` undefined. We need to guard against this.
5751
- return result && result.value;
5393
+ return result;
5752
5394
  }
5753
5395
 
5754
5396
  // If this is an inner synthetic event for an event with a bubbling surrogate
5755
- // (focus or blur), assume that the surrogate already propagated from triggering the
5756
- // native event and prevent that from happening again here.
5397
+ // (focus or blur), assume that the surrogate already propagated from triggering
5398
+ // the native event and prevent that from happening again here.
5757
5399
  // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
5758
5400
  // bubbling surrogate propagates *after* the non-bubbling base), but that seems
5759
5401
  // less bad than duplication.
@@ -5763,22 +5405,25 @@ function leverageNative( el, type, expectSync ) {
5763
5405
 
5764
5406
  // If this is a native event triggered above, everything is now in order
5765
5407
  // Fire an inner synthetic event with the original arguments
5766
- } else if ( saved.length ) {
5408
+ } else if ( saved ) {
5767
5409
 
5768
5410
  // ...and capture the result
5769
- dataPriv.set( this, type, {
5770
- value: jQuery.event.trigger(
5771
-
5772
- // Support: IE <=9 - 11+
5773
- // Extend with the prototype to reset the above stopImmediatePropagation()
5774
- jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
5775
- saved.slice( 1 ),
5776
- this
5777
- )
5778
- } );
5779
-
5780
- // Abort handling of the native event
5781
- event.stopImmediatePropagation();
5411
+ dataPriv.set( this, type, jQuery.event.trigger(
5412
+ saved[ 0 ],
5413
+ saved.slice( 1 ),
5414
+ this
5415
+ ) );
5416
+
5417
+ // Abort handling of the native event by all jQuery handlers while allowing
5418
+ // native handlers on the same element to run. On target, this is achieved
5419
+ // by stopping immediate propagation just on the jQuery event. However,
5420
+ // the native event is re-wrapped by a jQuery one on each level of the
5421
+ // propagation so the only way to stop it for jQuery is to stop it for
5422
+ // everyone via native `stopPropagation()`. This is not a problem for
5423
+ // focus/blur which don't bubble, but it does also stop click on checkboxes
5424
+ // and radios. We accept this limitation.
5425
+ event.stopPropagation();
5426
+ event.isImmediatePropagationStopped = returnTrue;
5782
5427
  }
5783
5428
  }
5784
5429
  } );
@@ -5917,18 +5562,73 @@ jQuery.each( {
5917
5562
  }, jQuery.event.addProp );
5918
5563
 
5919
5564
  jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5565
+
5566
+ function focusMappedHandler( nativeEvent ) {
5567
+ if ( document.documentMode ) {
5568
+
5569
+ // Support: IE 11+
5570
+ // Attach a single focusin/focusout handler on the document while someone wants
5571
+ // focus/blur. This is because the former are synchronous in IE while the latter
5572
+ // are async. In other browsers, all those handlers are invoked synchronously.
5573
+
5574
+ // `handle` from private data would already wrap the event, but we need
5575
+ // to change the `type` here.
5576
+ var handle = dataPriv.get( this, "handle" ),
5577
+ event = jQuery.event.fix( nativeEvent );
5578
+ event.type = nativeEvent.type === "focusin" ? "focus" : "blur";
5579
+ event.isSimulated = true;
5580
+
5581
+ // First, handle focusin/focusout
5582
+ handle( nativeEvent );
5583
+
5584
+ // ...then, handle focus/blur
5585
+ //
5586
+ // focus/blur don't bubble while focusin/focusout do; simulate the former by only
5587
+ // invoking the handler at the lower level.
5588
+ if ( event.target === event.currentTarget ) {
5589
+
5590
+ // The setup part calls `leverageNative`, which, in turn, calls
5591
+ // `jQuery.event.add`, so event handle will already have been set
5592
+ // by this point.
5593
+ handle( event );
5594
+ }
5595
+ } else {
5596
+
5597
+ // For non-IE browsers, attach a single capturing handler on the document
5598
+ // while someone wants focusin/focusout.
5599
+ jQuery.event.simulate( delegateType, nativeEvent.target,
5600
+ jQuery.event.fix( nativeEvent ) );
5601
+ }
5602
+ }
5603
+
5920
5604
  jQuery.event.special[ type ] = {
5921
5605
 
5922
5606
  // Utilize native event if possible so blur/focus sequence is correct
5923
5607
  setup: function() {
5924
5608
 
5609
+ var attaches;
5610
+
5925
5611
  // Claim the first handler
5926
5612
  // dataPriv.set( this, "focus", ... )
5927
5613
  // dataPriv.set( this, "blur", ... )
5928
- leverageNative( this, type, expectSync );
5614
+ leverageNative( this, type, true );
5929
5615
 
5930
- // Return false to allow normal processing in the caller
5931
- return false;
5616
+ if ( document.documentMode ) {
5617
+
5618
+ // Support: IE 9 - 11+
5619
+ // We use the same native handler for focusin & focus (and focusout & blur)
5620
+ // so we need to coordinate setup & teardown parts between those events.
5621
+ // Use `delegateType` as the key as `type` is already used by `leverageNative`.
5622
+ attaches = dataPriv.get( this, delegateType );
5623
+ if ( !attaches ) {
5624
+ this.addEventListener( delegateType, focusMappedHandler );
5625
+ }
5626
+ dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );
5627
+ } else {
5628
+
5629
+ // Return false to allow normal processing in the caller
5630
+ return false;
5631
+ }
5932
5632
  },
5933
5633
  trigger: function() {
5934
5634
 
@@ -5939,6 +5639,24 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
5939
5639
  return true;
5940
5640
  },
5941
5641
 
5642
+ teardown: function() {
5643
+ var attaches;
5644
+
5645
+ if ( document.documentMode ) {
5646
+ attaches = dataPriv.get( this, delegateType ) - 1;
5647
+ if ( !attaches ) {
5648
+ this.removeEventListener( delegateType, focusMappedHandler );
5649
+ dataPriv.remove( this, delegateType );
5650
+ } else {
5651
+ dataPriv.set( this, delegateType, attaches );
5652
+ }
5653
+ } else {
5654
+
5655
+ // Return false to indicate standard teardown should be applied
5656
+ return false;
5657
+ }
5658
+ },
5659
+
5942
5660
  // Suppress native focus or blur if we're currently inside
5943
5661
  // a leveraged native-event stack
5944
5662
  _default: function( event ) {
@@ -5947,6 +5665,58 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
5947
5665
 
5948
5666
  delegateType: delegateType
5949
5667
  };
5668
+
5669
+ // Support: Firefox <=44
5670
+ // Firefox doesn't have focus(in | out) events
5671
+ // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
5672
+ //
5673
+ // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
5674
+ // focus(in | out) events fire after focus & blur events,
5675
+ // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
5676
+ // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
5677
+ //
5678
+ // Support: IE 9 - 11+
5679
+ // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,
5680
+ // attach a single handler for both events in IE.
5681
+ jQuery.event.special[ delegateType ] = {
5682
+ setup: function() {
5683
+
5684
+ // Handle: regular nodes (via `this.ownerDocument`), window
5685
+ // (via `this.document`) & document (via `this`).
5686
+ var doc = this.ownerDocument || this.document || this,
5687
+ dataHolder = document.documentMode ? this : doc,
5688
+ attaches = dataPriv.get( dataHolder, delegateType );
5689
+
5690
+ // Support: IE 9 - 11+
5691
+ // We use the same native handler for focusin & focus (and focusout & blur)
5692
+ // so we need to coordinate setup & teardown parts between those events.
5693
+ // Use `delegateType` as the key as `type` is already used by `leverageNative`.
5694
+ if ( !attaches ) {
5695
+ if ( document.documentMode ) {
5696
+ this.addEventListener( delegateType, focusMappedHandler );
5697
+ } else {
5698
+ doc.addEventListener( type, focusMappedHandler, true );
5699
+ }
5700
+ }
5701
+ dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );
5702
+ },
5703
+ teardown: function() {
5704
+ var doc = this.ownerDocument || this.document || this,
5705
+ dataHolder = document.documentMode ? this : doc,
5706
+ attaches = dataPriv.get( dataHolder, delegateType ) - 1;
5707
+
5708
+ if ( !attaches ) {
5709
+ if ( document.documentMode ) {
5710
+ this.removeEventListener( delegateType, focusMappedHandler );
5711
+ } else {
5712
+ doc.removeEventListener( type, focusMappedHandler, true );
5713
+ }
5714
+ dataPriv.remove( dataHolder, delegateType );
5715
+ } else {
5716
+ dataPriv.set( dataHolder, delegateType, attaches );
5717
+ }
5718
+ }
5719
+ };
5950
5720
  } );
5951
5721
 
5952
5722
  // Create mouseenter/leave events using mouseover/out and event-time checks
@@ -6249,7 +6019,8 @@ jQuery.extend( {
6249
6019
  if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
6250
6020
  !jQuery.isXMLDoc( elem ) ) {
6251
6021
 
6252
- // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
6022
+ // We eschew jQuery#find here for performance reasons:
6023
+ // https://jsperf.com/getall-vs-sizzle/2
6253
6024
  destElements = getAll( clone );
6254
6025
  srcElements = getAll( elem );
6255
6026
 
@@ -6525,15 +6296,6 @@ var swap = function( elem, options, callback ) {
6525
6296
 
6526
6297
  var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6527
6298
 
6528
- var whitespace = "[\\x20\\t\\r\\n\\f]";
6529
-
6530
-
6531
- var rtrimCSS = new RegExp(
6532
- "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
6533
- "g"
6534
- );
6535
-
6536
-
6537
6299
 
6538
6300
 
6539
6301
  ( function() {
@@ -6842,7 +6604,8 @@ function setPositiveNumber( _elem, value, subtract ) {
6842
6604
  function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
6843
6605
  var i = dimension === "width" ? 1 : 0,
6844
6606
  extra = 0,
6845
- delta = 0;
6607
+ delta = 0,
6608
+ marginDelta = 0;
6846
6609
 
6847
6610
  // Adjustment may not be necessary
6848
6611
  if ( box === ( isBorderBox ? "border" : "content" ) ) {
@@ -6852,8 +6615,10 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed
6852
6615
  for ( ; i < 4; i += 2 ) {
6853
6616
 
6854
6617
  // Both box models exclude margin
6618
+ // Count margin delta separately to only add it after scroll gutter adjustment.
6619
+ // This is needed to make negative margins work with `outerHeight( true )` (gh-3982).
6855
6620
  if ( box === "margin" ) {
6856
- delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6621
+ marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6857
6622
  }
6858
6623
 
6859
6624
  // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
@@ -6904,7 +6669,7 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed
6904
6669
  ) ) || 0;
6905
6670
  }
6906
6671
 
6907
- return delta;
6672
+ return delta + marginDelta;
6908
6673
  }
6909
6674
 
6910
6675
  function getWidthOrHeight( elem, dimension, extra ) {
@@ -7002,26 +6767,35 @@ jQuery.extend( {
7002
6767
 
7003
6768
  // Don't automatically add "px" to these possibly-unitless properties
7004
6769
  cssNumber: {
7005
- "animationIterationCount": true,
7006
- "columnCount": true,
7007
- "fillOpacity": true,
7008
- "flexGrow": true,
7009
- "flexShrink": true,
7010
- "fontWeight": true,
7011
- "gridArea": true,
7012
- "gridColumn": true,
7013
- "gridColumnEnd": true,
7014
- "gridColumnStart": true,
7015
- "gridRow": true,
7016
- "gridRowEnd": true,
7017
- "gridRowStart": true,
7018
- "lineHeight": true,
7019
- "opacity": true,
7020
- "order": true,
7021
- "orphans": true,
7022
- "widows": true,
7023
- "zIndex": true,
7024
- "zoom": true
6770
+ animationIterationCount: true,
6771
+ aspectRatio: true,
6772
+ borderImageSlice: true,
6773
+ columnCount: true,
6774
+ flexGrow: true,
6775
+ flexShrink: true,
6776
+ fontWeight: true,
6777
+ gridArea: true,
6778
+ gridColumn: true,
6779
+ gridColumnEnd: true,
6780
+ gridColumnStart: true,
6781
+ gridRow: true,
6782
+ gridRowEnd: true,
6783
+ gridRowStart: true,
6784
+ lineHeight: true,
6785
+ opacity: true,
6786
+ order: true,
6787
+ orphans: true,
6788
+ scale: true,
6789
+ widows: true,
6790
+ zIndex: true,
6791
+ zoom: true,
6792
+
6793
+ // SVG-related
6794
+ fillOpacity: true,
6795
+ floodOpacity: true,
6796
+ stopOpacity: true,
6797
+ strokeMiterlimit: true,
6798
+ strokeOpacity: true
7025
6799
  },
7026
6800
 
7027
6801
  // Add in properties whose names you wish to fix before
@@ -8747,9 +8521,39 @@ jQuery.each( [ "radio", "checkbox" ], function() {
8747
8521
 
8748
8522
 
8749
8523
  // Return jQuery for attributes-only inclusion
8524
+ var location = window.location;
8525
+
8526
+ var nonce = { guid: Date.now() };
8527
+
8528
+ var rquery = ( /\?/ );
8529
+
8530
+
8531
+
8532
+ // Cross-browser xml parsing
8533
+ jQuery.parseXML = function( data ) {
8534
+ var xml, parserErrorElem;
8535
+ if ( !data || typeof data !== "string" ) {
8536
+ return null;
8537
+ }
8750
8538
 
8539
+ // Support: IE 9 - 11 only
8540
+ // IE throws on parseFromString with invalid input.
8541
+ try {
8542
+ xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8543
+ } catch ( e ) {}
8751
8544
 
8752
- support.focusin = "onfocusin" in window;
8545
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
8546
+ if ( !xml || parserErrorElem ) {
8547
+ jQuery.error( "Invalid XML: " + (
8548
+ parserErrorElem ?
8549
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
8550
+ return el.textContent;
8551
+ } ).join( "\n" ) :
8552
+ data
8553
+ ) );
8554
+ }
8555
+ return xml;
8556
+ };
8753
8557
 
8754
8558
 
8755
8559
  var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
@@ -8937,85 +8741,6 @@ jQuery.fn.extend( {
8937
8741
  } );
8938
8742
 
8939
8743
 
8940
- // Support: Firefox <=44
8941
- // Firefox doesn't have focus(in | out) events
8942
- // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
8943
- //
8944
- // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
8945
- // focus(in | out) events fire after focus & blur events,
8946
- // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
8947
- // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
8948
- if ( !support.focusin ) {
8949
- jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
8950
-
8951
- // Attach a single capturing handler on the document while someone wants focusin/focusout
8952
- var handler = function( event ) {
8953
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
8954
- };
8955
-
8956
- jQuery.event.special[ fix ] = {
8957
- setup: function() {
8958
-
8959
- // Handle: regular nodes (via `this.ownerDocument`), window
8960
- // (via `this.document`) & document (via `this`).
8961
- var doc = this.ownerDocument || this.document || this,
8962
- attaches = dataPriv.access( doc, fix );
8963
-
8964
- if ( !attaches ) {
8965
- doc.addEventListener( orig, handler, true );
8966
- }
8967
- dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8968
- },
8969
- teardown: function() {
8970
- var doc = this.ownerDocument || this.document || this,
8971
- attaches = dataPriv.access( doc, fix ) - 1;
8972
-
8973
- if ( !attaches ) {
8974
- doc.removeEventListener( orig, handler, true );
8975
- dataPriv.remove( doc, fix );
8976
-
8977
- } else {
8978
- dataPriv.access( doc, fix, attaches );
8979
- }
8980
- }
8981
- };
8982
- } );
8983
- }
8984
- var location = window.location;
8985
-
8986
- var nonce = { guid: Date.now() };
8987
-
8988
- var rquery = ( /\?/ );
8989
-
8990
-
8991
-
8992
- // Cross-browser xml parsing
8993
- jQuery.parseXML = function( data ) {
8994
- var xml, parserErrorElem;
8995
- if ( !data || typeof data !== "string" ) {
8996
- return null;
8997
- }
8998
-
8999
- // Support: IE 9 - 11 only
9000
- // IE throws on parseFromString with invalid input.
9001
- try {
9002
- xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
9003
- } catch ( e ) {}
9004
-
9005
- parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
9006
- if ( !xml || parserErrorElem ) {
9007
- jQuery.error( "Invalid XML: " + (
9008
- parserErrorElem ?
9009
- jQuery.map( parserErrorElem.childNodes, function( el ) {
9010
- return el.textContent;
9011
- } ).join( "\n" ) :
9012
- data
9013
- ) );
9014
- }
9015
- return xml;
9016
- };
9017
-
9018
-
9019
8744
  var
9020
8745
  rbracket = /\[\]$/,
9021
8746
  rCRLF = /\r?\n/g,
@@ -11016,7 +10741,7 @@ return jQuery;
11016
10741
  </script>
11017
10742
 
11018
10743
  <script>
11019
- <!-- Adding support for jquery-ui next: -->
10744
+ <!-- Adding support for jquery-ui (Version: 1.12.1) next: -->
11020
10745
  /*! jQuery UI - v1.12.1 - 2016-09-14
11021
10746
  * http://jqueryui.com
11022
10747
  * Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js
@@ -29726,120 +29451,178 @@ var widgetsTooltip = $.ui.tooltip;
29726
29451
  </script>
29727
29452
 
29728
29453
  <style>
29729
- #rounded_corners {
29730
- border: 2px solid #73AD21;
29454
+
29455
+ #top_header {
29456
+ border: 2px solid #73AD21;
29731
29457
  border-radius: 22px;
29732
- padding: 18px;
29733
- width: 500px;
29734
- height: 100px;
29458
+ padding: 18px;
29459
+ width: 500px;
29460
+ height: 140px;
29735
29461
  margin-bottom: 1.5em;
29736
- margin-left: 8%;
29737
- width: 60%;
29462
+ margin-left: 8%;
29463
+ width: 60%;
29464
+ }
29465
+
29466
+ .common_border {
29467
+ border: 2px solid #73AD21;
29468
+ border-radius: 22px;
29469
+ }
29470
+
29471
+ a:hover {
29472
+ color: lightgreen;
29738
29473
  }
29474
+
29739
29475
  </style>
29740
- <div id="rounded_corners"><b style="color: gold">17 images</b> will be shown next. These images have a collective (total) file size of <b style="color: lightblue">0.2 MB</b>.</div><table style="table-layout: fixed">
29741
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="BIOROEBE.png"><img id="drag_bioroebe" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="BIOROEBE.png">
29476
+
29477
+ <div id="top_header">
29478
+ <b style="color: gold">
29479
+ 17 images</b> will be shown next.
29480
+ These images have a collective (total) file size of <b style="color: lightblue;">0.2 MB</b>.
29481
+ <br><br>The time range of these images goes from the years <b class="yellowgreen"></b> to <b class="yellowgreen"></b>.
29482
+
29483
+ <br><br><a href="../bioroebe.html" style="color: lightblue; margin: auto; margin-left: 6em; font-weight: bold">
29484
+ → Go down to the base directory here.</a>
29485
+
29486
+ <br>
29487
+
29488
+ </div>
29489
+ <table style="table-layout: fixed; font-size: 1.1em">
29490
+ <tr style="width:25%;"><td style="width:28%">
29491
+ <a target="_blank" href="BIOROEBE.png"><img id="drag_bioroebe" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="BIOROEBE.png" width="440">
29742
29492
  <br><script>
29743
29493
  $(function() {
29744
29494
  $( "#drag_bioroebe" ).draggable();
29745
29495
  });
29746
- </script><br><span style="font-size: 1.2em; color: gold;">BIOROEBE</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>2</b> <b>kb</b>, <b>93x129px</b>)</span></td>
29747
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="BIOROEBE_NEW_LOGO.png"><img id="drag_bioroebe_new_logo" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="BIOROEBE_NEW_LOGO.png">
29496
+ </script><br><span style="font-size: 1.2em; color: gold;">BIOROEBE</span>
29497
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>2</b> <b>kb</b>, <b>93x129px</b>, <b>.png format</b>)</span></td>
29498
+ <td style="width: 28%">
29499
+ <a target="_blank" href="BIOROEBE_NEW_LOGO.png"><img id="drag_bioroebe_new_logo" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="BIOROEBE_NEW_LOGO.png" width="440">
29748
29500
  <br><script>
29749
29501
  $(function() {
29750
29502
  $( "#drag_bioroebe_new_logo" ).draggable();
29751
29503
  });
29752
- </script><br><span style="font-size: 1.2em; color: gold;">BIOROEBE NEW LOGO</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>26</b> <b>kb</b>, <b>321x400px</b>)</span></td>
29753
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="BlosumMatrixViewer.png"><img id="drag_blosummatrixviewer" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="BlosumMatrixViewer.png">
29504
+ </script><br><span style="font-size: 1.2em; color: gold;">BIOROEBE NEW LOGO</span>
29505
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>26</b> <b>kb</b>, <b>321x400px</b>, <b>.png format</b>)</span></td></tr>
29506
+ <tr style="width:25%;"><td style="width:28%">
29507
+ <a target="_blank" href="BlosumMatrixViewer.png"><img id="drag_blosummatrixviewer" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="BlosumMatrixViewer.png" width="440">
29754
29508
  <br><script>
29755
29509
  $(function() {
29756
29510
  $( "#drag_blosummatrixviewer" ).draggable();
29757
29511
  });
29758
- </script><br><span style="font-size: 1.2em; color: gold;">BlosumMatrixViewer</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>39</b> <b>kb</b>, <b>1354x878px</b>)</span></td>
29759
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="DnaToAminoacidWidget.png"><img id="drag_dnatoaminoacidwidget" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="DnaToAminoacidWidget.png">
29512
+ </script><br><span style="font-size: 1.2em; color: gold;">BlosumMatrixViewer</span>
29513
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>39</b> <b>kb</b>, <b>1354x878px</b>, <b>.png format</b>)</span></td>
29514
+ <td style="width: 28%">
29515
+ <a target="_blank" href="DnaToAminoacidWidget.png"><img id="drag_dnatoaminoacidwidget" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="DnaToAminoacidWidget.png" width="440">
29760
29516
  <br><script>
29761
29517
  $(function() {
29762
29518
  $( "#drag_dnatoaminoacidwidget" ).draggable();
29763
29519
  });
29764
- </script><br><span style="font-size: 1.2em; color: gold;">DnaToAminoacidWidget</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>15</b> <b>kb</b>, <b>1740x590px</b>)</span></td>
29765
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="FORWARD_PRIMER.png"><img id="drag_forward_primer" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="FORWARD_PRIMER.png">
29520
+ </script><br><span style="font-size: 1.2em; color: gold;">DnaToAminoacidWidget</span>
29521
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>15</b> <b>kb</b>, <b>1740x590px</b>, <b>.png format</b>)</span></td></tr>
29522
+ <tr style="width:25%;"><td style="width:28%">
29523
+ <a target="_blank" href="FORWARD_PRIMER.png"><img id="drag_forward_primer" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="FORWARD_PRIMER.png" width="440">
29766
29524
  <br><script>
29767
29525
  $(function() {
29768
29526
  $( "#drag_forward_primer" ).draggable();
29769
29527
  });
29770
- </script><br><span style="font-size: 1.2em; color: gold;">FORWARD PRIMER</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>1</b> <b>kb</b>, <b>74x47px</b>)</span></td>
29771
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="PRINTED_AMINOACID_TABLE.png"><img id="drag_printed_aminoacid_table" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="PRINTED_AMINOACID_TABLE.png">
29528
+ </script><br><span style="font-size: 1.2em; color: gold;">FORWARD PRIMER</span>
29529
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>1</b> <b>kb</b>, <b>74x47px</b>, <b>.png format</b>)</span></td>
29530
+ <td style="width: 28%">
29531
+ <a target="_blank" href="PRINTED_AMINOACID_TABLE.png"><img id="drag_printed_aminoacid_table" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="PRINTED_AMINOACID_TABLE.png" width="440">
29772
29532
  <br><script>
29773
29533
  $(function() {
29774
29534
  $( "#drag_printed_aminoacid_table" ).draggable();
29775
29535
  });
29776
- </script><br><span style="font-size: 1.2em; color: gold;">PRINTED AMINOACID TABLE</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>34</b> <b>kb</b>, <b>855x624px</b>)</span></td>
29777
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="REVERSE_PRIMER.png"><img id="drag_reverse_primer" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="REVERSE_PRIMER.png">
29536
+ </script><br><span style="font-size: 1.2em; color: gold;">PRINTED AMINOACID TABLE</span>
29537
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>34</b> <b>kb</b>, <b>855x624px</b>, <b>.png format</b>)</span></td></tr>
29538
+ <tr style="width:25%;"><td style="width:28%">
29539
+ <a target="_blank" href="REVERSE_PRIMER.png"><img id="drag_reverse_primer" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="REVERSE_PRIMER.png" width="440">
29778
29540
  <br><script>
29779
29541
  $(function() {
29780
29542
  $( "#drag_reverse_primer" ).draggable();
29781
29543
  });
29782
- </script><br><span style="font-size: 1.2em; color: gold;">REVERSE PRIMER</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>1</b> <b>kb</b>, <b>74x48px</b>)</span></td>
29783
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="class_ConvertAminoacidToDNA.png"><img id="drag_class_convertaminoacidtodna" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="class_ConvertAminoacidToDNA.png">
29544
+ </script><br><span style="font-size: 1.2em; color: gold;">REVERSE PRIMER</span>
29545
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>1</b> <b>kb</b>, <b>74x48px</b>, <b>.png format</b>)</span></td>
29546
+ <td style="width: 28%">
29547
+ <a target="_blank" href="class_ConvertAminoacidToDNA.png"><img id="drag_class_convertaminoacidtodna" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="class_ConvertAminoacidToDNA.png" width="440">
29784
29548
  <br><script>
29785
29549
  $(function() {
29786
29550
  $( "#drag_class_convertaminoacidtodna" ).draggable();
29787
29551
  });
29788
- </script><br><span style="font-size: 1.2em; color: gold;">class ConvertAminoacidToDNA</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>8</b> <b>kb</b>, <b>990x180px</b>)</span></td>
29789
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="class_SimpleStringComparer.png"><img id="drag_class_simplestringcomparer" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="class_SimpleStringComparer.png">
29552
+ </script><br><span style="font-size: 1.2em; color: gold;">class ConvertAminoacidToDNA</span>
29553
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>8</b> <b>kb</b>, <b>990x180px</b>, <b>.png format</b>)</span></td></tr>
29554
+ <tr style="width:25%;"><td style="width:28%">
29555
+ <a target="_blank" href="class_SimpleStringComparer.png"><img id="drag_class_simplestringcomparer" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="class_SimpleStringComparer.png" width="440">
29790
29556
  <br><script>
29791
29557
  $(function() {
29792
29558
  $( "#drag_class_simplestringcomparer" ).draggable();
29793
29559
  });
29794
- </script><br><span style="font-size: 1.2em; color: gold;">class SimpleStringComparer</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>1</b> <b>kb</b>, <b>580x97px</b>)</span></td>
29795
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="example_of_FASTA_coloured_output.png"><img id="drag_example_of_fasta_coloured_output" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="example_of_FASTA_coloured_output.png">
29560
+ </script><br><span style="font-size: 1.2em; color: gold;">class SimpleStringComparer</span>
29561
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>1</b> <b>kb</b>, <b>580x97px</b>, <b>.png format</b>)</span></td>
29562
+ <td style="width: 28%">
29563
+ <a target="_blank" href="example_of_FASTA_coloured_output.png"><img id="drag_example_of_fasta_coloured_output" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="example_of_FASTA_coloured_output.png" width="440">
29796
29564
  <br><script>
29797
29565
  $(function() {
29798
29566
  $( "#drag_example_of_fasta_coloured_output" ).draggable();
29799
29567
  });
29800
- </script><br><span style="font-size: 1.2em; color: gold;">example of FASTA coloured output</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>1</b> <b>kb</b>, <b>680x39px</b>)</span></td>
29801
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="libui_hamming_distance_widget.png"><img id="drag_libui_hamming_distance_widget" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="libui_hamming_distance_widget.png">
29568
+ </script><br><span style="font-size: 1.2em; color: gold;">example of FASTA coloured output</span>
29569
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>1</b> <b>kb</b>, <b>680x39px</b>, <b>.png format</b>)</span></td></tr>
29570
+ <tr style="width:25%;"><td style="width:28%">
29571
+ <a target="_blank" href="libui_hamming_distance_widget.png"><img id="drag_libui_hamming_distance_widget" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="libui_hamming_distance_widget.png" width="440">
29802
29572
  <br><script>
29803
29573
  $(function() {
29804
29574
  $( "#drag_libui_hamming_distance_widget" ).draggable();
29805
29575
  });
29806
- </script><br><span style="font-size: 1.2em; color: gold;">libui hamming distance widget</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>7</b> <b>kb</b>, <b>1222x242px</b>)</span></td>
29807
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="pretty_DNA_picture.png"><img id="drag_pretty_dna_picture" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="pretty_DNA_picture.png">
29576
+ </script><br><span style="font-size: 1.2em; color: gold;">libui hamming distance widget</span>
29577
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>7</b> <b>kb</b>, <b>1222x242px</b>, <b>.png format</b>)</span></td>
29578
+ <td style="width: 28%">
29579
+ <a target="_blank" href="pretty_DNA_picture.png"><img id="drag_pretty_dna_picture" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="pretty_DNA_picture.png" width="440">
29808
29580
  <br><script>
29809
29581
  $(function() {
29810
29582
  $( "#drag_pretty_dna_picture" ).draggable();
29811
29583
  });
29812
- </script><br><span style="font-size: 1.2em; color: gold;">pretty DNA picture</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>30</b> <b>kb</b>, <b>411x156px</b>)</span></td>
29813
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="primer_design_widget.png"><img id="drag_primer_design_widget" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="primer_design_widget.png">
29584
+ </script><br><span style="font-size: 1.2em; color: gold;">pretty DNA picture</span>
29585
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>30</b> <b>kb</b>, <b>411x156px</b>, <b>.png format</b>)</span></td></tr>
29586
+ <tr style="width:25%;"><td style="width:28%">
29587
+ <a target="_blank" href="primer_design_widget.png"><img id="drag_primer_design_widget" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="primer_design_widget.png" width="440">
29814
29588
  <br><script>
29815
29589
  $(function() {
29816
29590
  $( "#drag_primer_design_widget" ).draggable();
29817
29591
  });
29818
- </script><br><span style="font-size: 1.2em; color: gold;">primer design widget</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>15</b> <b>kb</b>, <b>1326x749px</b>)</span></td>
29819
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="restriction_enzyme_commandline_result.png"><img id="drag_restriction_enzyme_commandline_result" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="restriction_enzyme_commandline_result.png">
29592
+ </script><br><span style="font-size: 1.2em; color: gold;">primer design widget</span>
29593
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>15</b> <b>kb</b>, <b>1326x749px</b>, <b>.png format</b>)</span></td>
29594
+ <td style="width: 28%">
29595
+ <a target="_blank" href="restriction_enzyme_commandline_result.png"><img id="drag_restriction_enzyme_commandline_result" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="restriction_enzyme_commandline_result.png" width="440">
29820
29596
  <br><script>
29821
29597
  $(function() {
29822
29598
  $( "#drag_restriction_enzyme_commandline_result" ).draggable();
29823
29599
  });
29824
- </script><br><span style="font-size: 1.2em; color: gold;">restriction enzyme commandline result</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>6</b> <b>kb</b>, <b>614x159px</b>)</span></td>
29825
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="ruby-gtk_three_to_one_widget.png"><img id="drag_ruby_gtk_three_to_one_widget" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="ruby-gtk_three_to_one_widget.png">
29600
+ </script><br><span style="font-size: 1.2em; color: gold;">restriction enzyme commandline result</span>
29601
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>6</b> <b>kb</b>, <b>614x159px</b>, <b>.png format</b>)</span></td></tr>
29602
+ <tr style="width:25%;"><td style="width:28%">
29603
+ <a target="_blank" href="ruby-gtk_three_to_one_widget.png"><img id="drag_ruby_gtk_three_to_one_widget" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="ruby-gtk_three_to_one_widget.png" width="440">
29826
29604
  <br><script>
29827
29605
  $(function() {
29828
29606
  $( "#drag_ruby_gtk_three_to_one_widget" ).draggable();
29829
29607
  });
29830
- </script><br><span style="font-size: 1.2em; color: gold;">ruby-gtk three to one widget</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>9</b> <b>kb</b>, <b>800x190px</b>)</span></td>
29831
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="small_DNA_logo.png"><img id="drag_small_dna_logo" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="small_DNA_logo.png">
29608
+ </script><br><span style="font-size: 1.2em; color: gold;">ruby-gtk three to one widget</span>
29609
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>9</b> <b>kb</b>, <b>800x190px</b>, <b>.png format</b>)</span></td>
29610
+ <td style="width: 28%">
29611
+ <a target="_blank" href="small_DNA_logo.png"><img id="drag_small_dna_logo" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="small_DNA_logo.png" width="440">
29832
29612
  <br><script>
29833
29613
  $(function() {
29834
29614
  $( "#drag_small_dna_logo" ).draggable();
29835
29615
  });
29836
- </script><br><span style="font-size: 1.2em; color: gold;">small DNA logo</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>18</b> <b>kb</b>, <b>43x124px</b>)</span></td>
29837
- <tr style="width:25%;"><td style="width:28%"><a target="_blank" href="small_drosophila_image.png"><img id="drag_small_drosophila_image" style="border:1px solid black; margin-left: 4.5em; padding-left: 5px;" src="small_drosophila_image.png">
29616
+ </script><br><span style="font-size: 1.2em; color: gold;">small DNA logo</span>
29617
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>18</b> <b>kb</b>, <b>43x124px</b>, <b>.png format</b>)</span></td></tr>
29618
+ <tr style="width:25%;"><td style="width:28%">
29619
+ <a target="_blank" href="small_drosophila_image.png"><img id="drag_small_drosophila_image" style="border: 1px solid black; border-radius: 8px; margin-left: 4.5em; background-color: black; padding-left: 6px;" src="small_drosophila_image.png" width="440">
29838
29620
  <br><script>
29839
29621
  $(function() {
29840
29622
  $( "#drag_small_drosophila_image" ).draggable();
29841
29623
  });
29842
- </script><br><span style="font-size: 1.2em; color: gold;">small drosophila image</span></a> <span style="color: lightblue">(<b>filesize</b>: <b>1</b> <b>kb</b>, <b>48x45px</b>)</span></td>
29843
-
29624
+ </script><br><span style="font-size: 1.2em; color: gold;">small drosophila image</span>
29625
+ </a> <span style="color: lightblue">(<b>filesize</b>: <b>1</b> <b>kb</b>, <b>48x45px</b>, <b>.png format</b>)</span></td>
29626
+ </table>
29844
29627
  </body>
29845
- </html>
29628
+ </html>