6f4fa297396d06eca687e524ef5a720568583ebb
Based on notebook 04 - but separating out to see if there is difference between hypo and hyper methylated.
Based on notebook 04 - but separating out to see if there is difference between hypo and hyper methylated.
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/half-shell___Lab_notebook_of_Steven_Roberts_1ACECD10.png" alt="half-shell___Lab_notebook_of_Steven_Roberts_1ACECD10.png"/>
!date
%pylab inline
import scipy.stats as stats
Feature (from nb -03)
**tldr** 4 "new" tracks
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/IGV_and_Directory_Listing_of__halfshell_2015-02-hs-bedgraph__1AA51F1B.png" width =100% alt="IGV_and_Directory_Listing_of__halfshell_2015-02-hs-bedgraph__1AA51F1B.png"/>
```
/Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf
/Users/sr320/data-genomic/tentacle/rebuilt.gtf
/Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff
/Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff
```
Feature (from nb -03)
tldr 4 "new" tracks
/Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf
/Users/sr320/data-genomic/tentacle/rebuilt.gtf
/Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff
/Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff
`-wb Write the original entry in B for each overlap. Useful for knowing what A overlaps. Restricted by -f and -r.`
-wb Write the original entry in B for each overlap. Useful for knowing what A overlaps. Restricted by -f and -r.
xxxxxxxxxx
tldr
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/Screenshot_4_3_15__7_22_AM_1ACED994.png" alt="Screenshot_4_3_15__7_22_AM_1ACED994.png"/>
tldr
x
!head ./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.2M_sig.bedGraph
x
!fgrep -c "-" ./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.2M_sig.bedGraph
x
!fgrep "-" ./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.2M_sig.bedGraph | head
x
!fgrep "-" \
./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.2M_sig.bedGraph \
> /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph
!head /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph
!fgrep "-" \
./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.4M_sig.bedGraph \
> /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph
!head /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph
!fgrep "-" \
./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.6M_sig.bedGraph \
> /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph
!head /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 6 \
| sort | uniq -c
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 6 \
| sort | uniq -c
-wb \
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 6 \
| sort | uniq -c
x
!intersectbed \
-wb \
-a /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/array-design/OID40453_probe_locations.gff \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 11 \
| sort | uniq -c
x
# Enter the data comparing Oyster 2 then Probes
obs = array([[726, 7224], [117460, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
x
# Enter the data comparing Oyster 4 then Probes
obs = array([[426, 6560], [117460, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
x
# Enter the data comparing Oyster 6 then Probes
obs = array([[372, 7645], [117460, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
x
!fgrep -v "-" \
./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.2M_sig.bedGraph \
> /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph
!head /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph
!wc -l /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph
!fgrep -v "-" \
./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.4M_sig.bedGraph \
> /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph
!head /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph
!wc -l /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph
!fgrep -v "-" \
./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.6M_sig.bedGraph \
> /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph
!head /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph
!wc -l /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 6 \
| sort | uniq -c
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 6 \
| sort | uniq -c
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 6 \
| sort | uniq -c
!intersectbed \
-wb \
-a /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/array-design/OID40453_probe_locations.gff \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 11 \
| sort | uniq -c
x
# Enter the data comparing Oyster 2 then Probes
obs = array([[154, 2803], [117460, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
x
# Enter the data comparing Oyster 2 then Probes
obs = array([[278, 3587], [117460, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
x
# Enter the data comparing Oyster 2 then Probes
obs = array([[260, 4044], [117460, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
!intersectbed \
-wb \
-a ./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.2M_sig.bedGraph \
-b /Users/sr320/data-genomic/tentacle/rebuilt.gtf \
| cut -f 6 \
| sort | uniq -c
!intersectbed \
-wb \
-a ./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.4M_sig.bedGraph \
-b /Users/sr320/data-genomic/tentacle/rebuilt.gtf \
| cut -f 6 \
| sort | uniq -c
!intersectbed \
-wb \
-a ./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.6M_sig.bedGraph \
-b /Users/sr320/data-genomic/tentacle/rebuilt.gtf \
| cut -f 6 \
| sort | uniq -c
!intersectbed \
-wb \
-a /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/array-design/OID40453_probe_locations.gff \
-b /Users/sr320/data-genomic/tentacle/rebuilt.gtf \
| cut -f 11 \
| sort | uniq -c
x
# Enter the data comparing Oyster 2 then Probes
obs = array([[8768, 10028], [1197818, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
chi2_corrected = stats.chi2_contingency(obs, correction=True)
# Enter the data comparing Oyster 4 then Probes
obs = array([[7694, 10148], [1197818, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
# Enter the data comparing Oyster 6 then Probes
obs = array([[6160, 11690], [1197818, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
Separating out hypo and hyper
Separating out hypo and hyper
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/Screenshot_4_3_15__7_23_AM_1ACED9DD.png" alt="Screenshot_4_3_15__7_23_AM_1ACED9DD.png"/>
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff \
| cut -f 6 \
| sort | uniq -c
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff \
| cut -f 6 \
| sort | uniq -c
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff \
| cut -f 6 \
| sort | uniq -c
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff \
| cut -f 6 \
| sort | uniq -c
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff \
| cut -f 6 \
| sort | uniq -c
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff \
| cut -f 6 \
| sort | uniq -c
!intersectbed \
-wb \
-a /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/array-design/OID40453_probe_locations.gff \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff \
| cut -f 11 \
| sort | uniq -c
# Enter the data comparing Oyster 2 then Probes
obs = array([[3210, 10028], [251970, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
# Enter the data comparing Oyster 4 then Probes
obs = array([[3369, 10148], [251970, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
# Enter the data comparing Oyster 6 then Probes
obs = array([[3819, 11690], [251970, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
separating Hypo and Hyper
separating Hypo and Hyper
tldr
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/Screenshot_4_3_15__7_28_AM_1ACEDB27.png" alt="Screenshot_4_3_15__7_28_AM_1ACEDB27.png"/>
tldr
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff \
| cut -f 6 \
| sort | uniq -c
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff \
| cut -f 6 \
| sort | uniq -c
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff \
| cut -f 6 \
| sort | uniq -c
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff \
| cut -f 6 \
| sort | uniq -c
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff \
| cut -f 6 \
| sort | uniq -c
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff \
| cut -f 6 \
| sort | uniq -c
!intersectbed \
-wb \
-a /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/array-design/OID40453_probe_locations.gff \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff \
| cut -f 11 \
| sort | uniq -c
# Enter the data comparing Oyster 2 then Probes
obs = array([[2809, 10028], [190475, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
# Enter the data comparing Oyster 4 then Probes
obs = array([[2738, 10148], [190475, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
# Enter the data comparing Oyster 6 then Probes
obs = array([[3216, 11690], [190475, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/Screenshot_4_3_15__7_42_AM_1ACEDE69.png" alt="Screenshot_4_3_15__7_42_AM_1ACEDE69.png"/>
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \
| cut -f 6 \
| sort | uniq -c | sed '/#/d'
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \
| cut -f 6 \
| sort | uniq -c | sed '/#/d'
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \
| cut -f 6 \
| sort | uniq -c | sed '/#/d'
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \
| cut -f 6 \
| sort | uniq -c | sed '/#/d'
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \
| cut -f 6 \
| sort | uniq -c | sed '/#/d'
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \
| cut -f 6 \
| sort | uniq -c | sed '/#/d'
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/Screenshot_4_3_15__7_48_AM_1ACEDFD9.png" alt="Screenshot_4_3_15__7_48_AM_1ACEDFD9.png"/>
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!intersectbed \ -wb \ -a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \ -b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \ | cut -f 6,7 \ | sort | uniq -c | sed '/#/d' !intersectbed \ -wb \ -a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \ -b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \ | cut -f 6,7 \ | sort | uniq -c | sed '/#/d'
x
# Enter the data comparing Oyster ALL hypo versus hyper -HOUSEKEEPING
obs = array([[6527, 21429], [3871, 10434]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
x
# Enter the data comparing Oyster ALL hypo versus hyper -DEGS
obs = array([[1524, 21429], [692, 10434]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
x
# Enter the data comparing Oyster ALL hypo versus hyper -TE blast
obs = array([[760, 21429], [45, 10434]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/Screenshot_4_3_15__8_07_AM_1ACEE442.png" alt="Screenshot_4_3_15__8_07_AM_1ACEE442.png"/>
# Hypo v Hyper on Ensembl gff - gives data on gene body, and repeats
x
!echo "hypo"
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!echo "hyper"
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!echo "hypo"
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!echo "hyper"
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!echo "hypo"
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!echo "hyper"
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
Python <%- pyver %>')({ pyver: sys_info.sys_version }); var kinfo = $('
').html(text)); body.append($('
').text(data.content.banner)); }); } catch (e) { kinfo.html($('').text('unable to contact kernel')); } }); }); diff --git a/ipynb/Array-feature-overlap-05_files/actions.js b/ipynb/Array-feature-overlap-05_files/actions.js new file mode 100644 index 0000000..828b724 --- /dev/null +++ b/ipynb/Array-feature-overlap-05_files/actions.js
...
// Copyright (c) IPython Development Team. // Distributed under the terms of the Modified BSD License. define(function(require){ "use strict"; var ActionHandler = function (env) { this.env = env || {}; Object.seal(this); }; /** * A bunch of predefined `Simple Actions` used by IPython. * `Simple Actions` have the following keys: * help (optional): a short string the describe the action. * will be used in various context, like as menu name, tool tips on buttons, * and short description in help menu. * help_index (optional): a string used to sort action in help menu. * icon (optional): a short string that represent the icon that have to be used with this * action. this should mainly correspond to a Font_awesome class. * handler : a function which is called when the action is activated. It will receive at first parameter * a dictionary containing various handle to element of the notebook. * * action need to be registered with a **name** that can be use to refer to this action. * * * if `help` is not provided it will be derived by replacing any dash by space * in the **name** of the action. It is advised to provide a prefix to action name to * avoid conflict the prefix should be all lowercase and end with a dot `.` * in the absence of a prefix the behavior of the action is undefined. * * All action provided by IPython are prefixed with `ipython.`. * * One can register extra actions or replace an existing action with another one is possible * but is considered undefined behavior. * **/ var _actions = { 'run-select-next': { icon: 'fa-play', help : 'run cell, select below', help_index : 'ba', handler : function (env) { env.notebook.execute_cell_and_select_below(); } }, 'execute-in-place':{ help : 'run cell', help_index : 'bb', handler : function (env) { env.notebook.execute_cell(); } }, 'execute-and-insert-after':{ help : 'run cell, insert below', help_index : 'bc', handler : function (env) { env.notebook.execute_cell_and_insert_below(); } }, 'go-to-command-mode': { help : 'command mode', help_index : 'aa', handler : function (env) { env.notebook.command_mode(); } }, 'split-cell-at-cursor': { help : 'split cell', help_index : 'ea', handler : function (env) { env.notebook.split_cell(); } }, 'enter-edit-mode' : { help_index : 'aa', handler : function (env) { env.notebook.edit_mode(); } }, 'select-previous-cell' : { help: 'select cell above', help_index : 'da', handler : function (env) { var index = env.notebook.get_selected_index(); if (index !== 0 && index !== null) { env.notebook.select_prev(); env.notebook.focus_cell(); } } }, 'select-next-cell' : { help: 'select cell below', help_index : 'db', handler : function (env) { var index = env.notebook.get_selected_index(); if (index !== (env.notebook.ncells()-1) && index !== null) { env.notebook.select_next(); env.notebook.focus_cell(); } } }, 'cut-selected-cell' : { icon: 'fa-cut', help_index : 'ee', handler : function (env) { var index = env.notebook.get_selected_index(); env.notebook.cut_cell(); env.notebook.select(index); env.notebook.focus_cell(); } }, 'copy-selected-cell' : { icon: 'fa-copy', help_index : 'ef', handler : function (env) { env.notebook.copy_cell(); env.notebook.focus_cell(); } }, 'paste-cell-before' : { help: 'paste cell above', help_index : 'eg', handler : function (env) { env.notebook.paste_cell_above(); } }, 'paste-cell-after' : { help: 'paste cell below', icon: 'fa-paste', help_index : 'eh', handler : function (env) { env.notebook.paste_cell_below(); } }, 'insert-cell-before' : { help: 'insert cell above', help_index : 'ec', handler : function (env) { env.notebook.insert_cell_above(); env.notebook.select_prev(); env.notebook.focus_cell(); } }, 'insert-cell-after' : { help: 'insert cell below', icon : 'fa-plus', help_index : 'ed', handler : function (env) { env.notebook.insert_cell_below(); env.notebook.select_next(); env.notebook.focus_cell(); } }, 'change-selected-cell-to-code-cell' : { help : 'to code', help_index : 'ca', handler : function (env) { env.notebook.to_code(); } }, 'change-selected-cell-to-markdown-cell' : { help : 'to markdown', help_index : 'cb', handler : function (env) { env.notebook.to_markdown(); } }, 'change-selected-cell-to-raw-cell' : { help : 'to raw', help_index : 'cc', handler : function (env) { env.notebook.to_raw(); } }, 'change-selected-cell-to-heading-1' : { help : 'to heading 1', help_index : 'cd', handler : function (env) { env.notebook.to_heading(undefined, 1); } }, 'change-selected-cell-to-heading-2' : { help : 'to heading 2', help_index : 'ce', handler : function (env) { env.notebook.to_heading(undefined, 2); } }, 'change-selected-cell-to-heading-3' : { help : 'to heading 3', help_index : 'cf', handler : function (env) { env.notebook.to_heading(undefined, 3); } }, 'change-selected-cell-to-heading-4' : { help : 'to heading 4', help_index : 'cg', handler : function (env) { env.notebook.to_heading(undefined, 4); } }, 'change-selected-cell-to-heading-5' : { help : 'to heading 5', help_index : 'ch', handler : function (env) { env.notebook.to_heading(undefined, 5); } }, 'change-selected-cell-to-heading-6' : { help : 'to heading 6', help_index : 'ci', handler : function (env) { env.notebook.to_heading(undefined, 6); } }, 'toggle-output-visibility-selected-cell' : { help : 'toggle output', help_index : 'gb', handler : function (env) { env.notebook.toggle_output(); } }, 'toggle-output-scrolling-selected-cell' : { help : 'toggle output scrolling', help_index : 'gc', handler : function (env) { env.notebook.toggle_output_scroll(); } }, 'move-selected-cell-down' : { icon: 'fa-arrow-down', help_index : 'eb', handler : function (env) { env.notebook.move_cell_down(); } }, 'move-selected-cell-up' : { icon: 'fa-arrow-up', help_index : 'ea', handler : function (env) { env.notebook.move_cell_up(); } }, 'toggle-line-number-selected-cell' : { help : 'toggle line numbers', help_index : 'ga', handler : function (env) { env.notebook.cell_toggle_line_numbers(); } }, 'show-keyboard-shortcut-help-dialog' : { help_index : 'ge', handler : function (env) { env.quick_help.show_keyboard_shortcuts(); } }, 'delete-cell': { help: 'delete selected cell', help_index : 'ej', handler : function (env) { env.notebook.delete_cell(); } }, 'interrupt-kernel':{ icon: 'fa-stop', help_index : 'ha', handler : function (env) { env.notebook.kernel.interrupt(); env.notebook.focus_cell(); } }, 'restart-kernel':{ icon: 'fa-repeat', help_index : 'hb', handler : function (env) { env.notebook.restart_kernel(); env.notebook.focus_cell(); } }, 'undo-last-cell-deletion' : { help_index : 'ei', handler : function (env) { env.notebook.undelete_cell(); } }, 'merge-selected-cell-with-cell-after' : { help : 'merge cell below', help_index : 'ek', handler : function (env) { env.notebook.merge_cell_below(); } }, 'close-pager' : { help_index : 'gd', handler : function (env) { env.pager.collapse(); } } }; /** * A bunch of `Advance actions` for IPython. * Cf `Simple Action` plus the following properties. * * handler: first argument of the handler is the event that triggerd the action * (typically keypress). The handler is responsible for any modification of the * event and event propagation. * Is also responsible for returning false if the event have to be further ignored, * true, to tell keyboard manager that it ignored the event. * * the second parameter of the handler is the environemnt passed to Simple Actions * **/ var custom_ignore = { 'ignore':{ handler : function () { return true; } }, 'move-cursor-up-or-previous-cell':{ handler : function (env, event) { var index = env.notebook.get_selected_index(); var cell = env.notebook.get_cell(index); var cm = env.notebook.get_selected_cell().code_mirror; var cur = cm.getCursor(); if (cell && cell.at_top() && index !== 0 && cur.ch === 0) { if(event){ event.preventDefault(); } env.notebook.command_mode(); env.notebook.select_prev(); env.notebook.edit_mode(); cm = env.notebook.get_selected_cell().code_mirror; cm.setCursor(cm.lastLine(), 0); } return false; } }, 'move-cursor-down-or-next-cell':{ handler : function (env, event) { var index = env.notebook.get_selected_index(); var cell = env.notebook.get_cell(index); if (cell.at_bottom() && index !== (env.notebook.ncells()-1)) { if(event){ event.preventDefault(); } env.notebook.command_mode(); env.notebook.select_next(); env.notebook.edit_mode(); var cm = env.notebook.get_selected_cell().code_mirror; cm.setCursor(0, 0); } return false; } }, 'scroll-down': { handler: function(env, event) { if(event){ event.preventDefault(); } return env.notebook.scroll_manager.scroll(1); }, }, 'scroll-up': { handler: function(env, event) { if(event){ event.preventDefault(); } return env.notebook.scroll_manager.scroll(-1); }, }, 'save-notebook':{ help: "Save and Checkpoint", help_index : 'fb', icon: 'fa-save', handler : function (env, event) { env.notebook.save_checkpoint(); if(event){ event.preventDefault(); } return false; } }, }; // private stuff that prepend `.ipython` to actions names // and uniformize/fill in missing pieces in of an action. var _prepare_handler = function(registry, subkey, source){ registry['ipython.'+subkey] = {}; registry['ipython.'+subkey].help = source[subkey].help||subkey.replace(/-/g,' '); registry['ipython.'+subkey].help_index = source[subkey].help_index; registry['ipython.'+subkey].icon = source[subkey].icon; return source[subkey].handler; }; // Will actually generate/register all the IPython actions var fun = function(){ var final_actions = {}; var k; for(k in _actions){ if(_actions.hasOwnProperty(k)){ // Js closure are function level not block level need to wrap in a IIFE // and append ipython to event name these things do intercept event so are wrapped // in a function that return false. var handler = _prepare_handler(final_actions, k, _actions); (function(key, handler){ final_actions['ipython.'+key].handler = function(env, event){ handler(env); if(event){ event.preventDefault(); } return false; }; })(k, handler); } } for(k in custom_ignore){ // Js closure are function level not block level need to wrap in a IIFE // same as above, but decide for themselves wether or not they intercept events. if(custom_ignore.hasOwnProperty(k)){ var handler = _prepare_handler(final_actions, k, custom_ignore); (function(key, handler){ final_actions['ipython.'+key].handler = function(env, event){ return handler(env, event); }; })(k, handler); } } return final_actions; }; ActionHandler.prototype._actions = fun(); /** * extend the environment variable that will be pass to handlers **/ ActionHandler.prototype.extend_env = function(env){ for(var k in env){ this.env[k] = env[k]; } }; ActionHandler.prototype.register = function(action, name, prefix){ /** * Register an `action` with an optional name and prefix. * * if name and prefix are not given they will be determined automatically. * if action if just a `function` it will be wrapped in an anonymous action. * * @return the full name to access this action . **/ action = this.normalise(action); if( !name ){ name = 'autogenerated-'+String(action.handler); } prefix = prefix || 'auto'; var full_name = prefix+'.'+name; this._actions[full_name] = action; return full_name; }; ActionHandler.prototype.normalise = function(data){ /** * given an `action` or `function`, return a normalised `action` * by setting all known attributes and removing unknown attributes; **/ if(typeof(data) === 'function'){ data = {handler:data}; } if(typeof(data.handler) !== 'function'){ throw('unknown datatype, cannot register'); } var _data = data; data = {}; data.handler = _data.handler; data.help = _data.help || ''; data.icon = _data.icon || ''; data.help_index = _data.help_index || ''; return data; }; ActionHandler.prototype.get_name = function(name_or_data){ /** * given an `action` or `name` of a action, return the name attached to this action. * if given the name of and corresponding actions does not exist in registry, return `null`. **/ if(typeof(name_or_data) === 'string'){ if(this.exists(name_or_data)){ return name_or_data; } else { return null; } } else { return this.register(name_or_data); } }; ActionHandler.prototype.get = function(name){ return this._actions[name]; }; ActionHandler.prototype.call = function(name, event, env){ return this._actions[name].handler(env|| this.env, event); }; ActionHandler.prototype.exists = function(name){ return (typeof(this._actions[name]) !== 'undefined'); }; return {init:ActionHandler}; }); diff --git a/ipynb/Array-feature-overlap-05_files/backbone-min.js b/ipynb/Array-feature-overlap-05_files/backbone-min.js new file mode 100644 index 0000000..3b2593d --- /dev/null +++ b/ipynb/Array-feature-overlap-05_files/backbone-min.js
...
(function(){var t=this;var e=t.Backbone;var i=[];var r=i.push;var s=i.slice;var n=i.splice;var a;if(typeof exports!=="undefined"){a=exports}else{a=t.Backbone={}}a.VERSION="1.1.0";var h=t._;if(!h&&typeof require!=="undefined")h=require("underscore");a.$=t.jQuery||t.Zepto||t.ender||t.$;a.noConflict=function(){t.Backbone=e;return this};a.emulateHTTP=false;a.emulateJSON=false;var o=a.Events={on:function(t,e,i){if(!l(this,"on",t,[e,i])||!e)return this;this._events||(this._events={});var r=this._events[t]||(this._events[t]=[]);r.push({callback:e,context:i,ctx:i||this});return this},once:function(t,e,i){if(!l(this,"once",t,[e,i])||!e)return this;var r=this;var s=h.once(function(){r.off(t,s);e.apply(this,arguments)});s._callback=e;return this.on(t,s,i)},off:function(t,e,i){var r,s,n,a,o,u,c,f;if(!this._events||!l(this,"off",t,[e,i]))return this;if(!t&&!e&&!i){this._events={};return this}a=t?[t]:h.keys(this._events);for(o=0,u=a.length;o").attr(t);this.setElement(e,false)}else{this.setElement(h.result(this,"el"),false)}}});a.sync=function(t,e,i){var r=T[t];h.defaults(i||(i={}),{emulateHTTP:a.emulateHTTP,emulateJSON:a.emulateJSON});var s={type:r,dataType:"json"};if(!i.url){s.url=h.result(e,"url")||U()}if(i.data==null&&e&&(t==="create"||t==="update"||t==="patch")){s.contentType="application/json";s.data=JSON.stringify(i.attrs||e.toJSON(i))}if(i.emulateJSON){s.contentType="application/x-www-form-urlencoded";s.data=s.data?{model:s.data}:{}}if(i.emulateHTTP&&(r==="PUT"||r==="DELETE"||r==="PATCH")){s.type="POST";if(i.emulateJSON)s.data._method=r;var n=i.beforeSend;i.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",r);if(n)return n.apply(this,arguments)}}if(s.type!=="GET"&&!i.emulateJSON){s.processData=false}if(s.type==="PATCH"&&E){s.xhr=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}var o=i.xhr=a.ajax(h.extend(s,i));e.trigger("request",e,o,i);return o};var E=typeof window!=="undefined"&&!!window.ActiveXObject&&!(window.XMLHttpRequest&&(new XMLHttpRequest).dispatchEvent);var T={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};a.ajax=function(){return a.$.ajax.apply(a.$,arguments)};var k=a.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var S=/\((.*?)\)/g;var $=/(\(\?)?:\w+/g;var H=/\*\w+/g;var A=/[\-{}\[\]+?.,\\\^$|#\s]/g;h.extend(k.prototype,o,{initialize:function(){},route:function(t,e,i){if(!h.isRegExp(t))t=this._routeToRegExp(t);if(h.isFunction(e)){i=e;e=""}if(!i)i=this[e];var r=this;a.history.route(t,function(s){var n=r._extractParameters(t,s);i&&i.apply(r,n);r.trigger.apply(r,["route:"+e].concat(n));r.trigger("route",e,n);a.history.trigger("route",r,e,n)});return this},navigate:function(t,e){a.history.navigate(t,e);return this},_bindRoutes:function(){if(!this.routes)return;this.routes=h.result(this,"routes");var t,e=h.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(A,"\\$&").replace(S,"(?:$1)?").replace($,function(t,e){return e?t:"([^/]+)"}).replace(H,"(.*?)");return new RegExp("^"+t+"$")},_extractParameters:function(t,e){var i=t.exec(e).slice(1);return h.map(i,function(t){return t?decodeURIComponent(t):null})}});var I=a.History=function(){this.handlers=[];h.bindAll(this,"checkUrl");if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var N=/^[#\/]|\s+$/g;var O=/^\/+|\/+$/g;var P=/msie [\w.]+/;var C=/\/$/;var j=/[?#].*$/;I.started=false;h.extend(I.prototype,o,{interval:50,getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:""},getFragment:function(t,e){if(t==null){if(this._hasPushState||!this._wantsHashChange||e){t=this.location.pathname;var i=this.root.replace(C,"");if(!t.indexOf(i))t=t.slice(i.length)}else{t=this.getHash()}}return t.replace(N,"")},start:function(t){if(I.started)throw new Error("Backbone.history has already been started");I.started=true;this.options=h.extend({root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var e=this.getFragment();var i=document.documentMode;var r=P.exec(navigator.userAgent.toLowerCase())&&(!i||i<=7);this.root=("/"+this.root+"/").replace(O,"/");if(r&&this._wantsHashChange){this.iframe=a.$('').hide().appendTo("body")[0].contentWindow;this.navigate(e)}if(this._hasPushState){a.$(window).on("popstate",this.checkUrl)}else if(this._wantsHashChange&&"onhashchange"in window&&!r){a.$(window).on("hashchange",this.checkUrl)}else if(this._wantsHashChange){this._checkUrlInterval=setInterval(this.checkUrl,this.interval)}this.fragment=e;var s=this.location;var n=s.pathname.replace(/[^\/]$/,"$&/")===this.root;if(this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!n){this.fragment=this.getFragment(null,true);this.location.replace(this.root+this.location.search+"#"+this.fragment);return true}else if(this._hasPushState&&n&&s.hash){this.fragment=this.getHash().replace(N,"");this.history.replaceState({},document.title,this.root+this.fragment+s.search)}}if(!this.options.silent)return this.loadUrl()},stop:function(){a.$(window).off("popstate",this.checkUrl).off("hashchange",this.checkUrl);clearInterval(this._checkUrlInterval);I.started=false},route:function(t,e){this.handlers.unshift({route:t,callback:e})},checkUrl:function(t){var e=this.getFragment();if(e===this.fragment&&this.iframe){e=this.getFragment(this.getHash(this.iframe))}if(e===this.fragment)return false;if(this.iframe)this.navigate(e);this.loadUrl()},loadUrl:function(t){t=this.fragment=this.getFragment(t);return h.any(this.handlers,function(e){if(e.route.test(t)){e.callback(t);return true}})},navigate:function(t,e){if(!I.started)return false;if(!e||e===true)e={trigger:!!e};var i=this.root+(t=this.getFragment(t||""));t=t.replace(j,"");if(this.fragment===t)return;this.fragment=t;if(t===""&&i!=="/")i=i.slice(0,-1);if(this._hasPushState){this.history[e.replace?"replaceState":"pushState"]({},document.title,i)}else if(this._wantsHashChange){this._updateHash(this.location,t,e.replace);if(this.iframe&&t!==this.getFragment(this.getHash(this.iframe))){if(!e.replace)this.iframe.document.open().close();this._updateHash(this.iframe.location,t,e.replace)}}else{return this.location.assign(i)}if(e.trigger)return this.loadUrl(t)},_updateHash:function(t,e,i){if(i){var r=t.href.replace(/(javascript:|#).*$/,"");t.replace(r+"#"+e)}else{t.hash="#"+e}}});a.history=new I;var R=function(t,e){var i=this;var r;if(t&&h.has(t,"constructor")){r=t.constructor}else{r=function(){return i.apply(this,arguments)}}h.extend(r,i,e);var s=function(){this.constructor=r};s.prototype=i.prototype;r.prototype=new s;if(t)h.extend(r.prototype,t);r.__super__=i.prototype;return r};d.extend=v.extend=k.extend=w.extend=I.extend=R;var U=function(){throw new Error('A "url" property or function must be specified')};var M=function(t,e){var i=e.error;e.error=function(r){if(i)i(t,r,e);t.trigger("error",t,r,e)}}}).call(this);</span> <span class='diff-add'>//# sourceMappingURL=backbone-min.map</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/bootstrap-tour.min.css b/ipynb/Array-feature-overlap-05_files/bootstrap-tour.min.css</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..f98810c</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/bootstrap-tour.min.css</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>/* ========================================================================</span> <span class='diff-add'> * bootstrap-tour - v0.10.1</span> <span class='diff-add'> * http://bootstraptour.com</span> <span class='diff-add'> * ========================================================================</span> <span class='diff-add'> * Copyright 2012-2013 Ulrich Sossou</span> <span class='diff-add'> *</span> <span class='diff-add'> * ========================================================================</span> <span class='diff-add'> * Licensed under the Apache License, Version 2.0 (the "License");</span> <span class='diff-add'> * you may not use this file except in compliance with the License.</span> <span class='diff-add'> * You may obtain a copy of the License at</span> <span class='diff-add'> *</span> <span class='diff-add'> * http://www.apache.org/licenses/LICENSE-2.0</span> <span class='diff-add'> *</span> <span class='diff-add'> * Unless required by applicable law or agreed to in writing, software</span> <span class='diff-add'> * distributed under the License is distributed on an "AS IS" BASIS,</span> <span class='diff-add'> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span> <span class='diff-add'> * See the License for the specific language governing permissions and</span> <span class='diff-add'> * limitations under the License.</span> <span class='diff-add'> * ========================================================================</span> <span class='diff-add'> */</span> <span class='diff-add'>.tour-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1100;background-color:#000;opacity:.8;filter:alpha(opacity=80)}.tour-step-backdrop{position:relative;z-index:1101;background:inherit}.tour-step-backdrop>td{position:relative;z-index:1101}.tour-step-background{position:absolute!important;z-index:1100;background:inherit;border-radius:6px}.popover[class*=tour-]{z-index:1100}.popover[class*=tour-] .popover-navigation{padding:9px 14px}.popover[class*=tour-] .popover-navigation [data-role=end]{float:right}.popover[class*=tour-] .popover-navigation [data-role=prev],.popover[class*=tour-] .popover-navigation [data-role=next],.popover[class*=tour-] .popover-navigation [data-role=end]{cursor:pointer}.popover[class*=tour-] .popover-navigation [data-role=prev].disabled,.popover[class*=tour-] .popover-navigation [data-role=next].disabled,.popover[class*=tour-] .popover-navigation [data-role=end].disabled{cursor:default}.popover[class*=tour-].orphan{position:fixed;margin-top:0}.popover[class*=tour-].orphan .arrow{display:none}</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/bootstrap-tour.min.js b/ipynb/Array-feature-overlap-05_files/bootstrap-tour.min.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..12e7228</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/bootstrap-tour.min.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>/* ========================================================================</span> <span class='diff-add'> * bootstrap-tour - v0.10.1</span> <span class='diff-add'> * http://bootstraptour.com</span> <span class='diff-add'> * ========================================================================</span> <span class='diff-add'> * Copyright 2012-2013 Ulrich Sossou</span> <span class='diff-add'> *</span> <span class='diff-add'> * ========================================================================</span> <span class='diff-add'> * Licensed under the Apache License, Version 2.0 (the "License");</span> <span class='diff-add'> * you may not use this file except in compliance with the License.</span> <span class='diff-add'> * You may obtain a copy of the License at</span> <span class='diff-add'> *</span> <span class='diff-add'> * http://www.apache.org/licenses/LICENSE-2.0</span> <span class='diff-add'> *</span> <span class='diff-add'> * Unless required by applicable law or agreed to in writing, software</span> <span class='diff-add'> * distributed under the License is distributed on an "AS IS" BASIS,</span> <span class='diff-add'> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span> <span class='diff-add'> * See the License for the specific language governing permissions and</span> <span class='diff-add'> * limitations under the License.</span> <span class='diff-add'> * ========================================================================</span> <span class='diff-add'> */</span> <span class='diff-add'>+function(t){"use strict";function e(e){return this.each(function(){var n=t(this),i=n.data("bs.tooltip"),r="object"==typeof e&&e;(i||"destroy"!=e)&&(i||n.data("bs.tooltip",i=new o(this,r)),"string"==typeof e&&i[e]())})}var o=function(t,e){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",t,e)};o.VERSION="3.2.0",o.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},o.prototype.init=function(e,o,n){this.enabled=!0,this.type=e,this.$element=t(o),this.options=this.getOptions(n),this.$viewport=this.options.viewport&&t(this.options.viewport.selector||this.options.viewport);for(var i=this.options.trigger.split(" "),r=i.length;r--;){var s=i[r];if("click"==s)this.$element.on("click."+this.type,this.options.selector,t.proxy(this.toggle,this));else if("manual"!=s){var a="hover"==s?"mouseenter":"focusin",p="hover"==s?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,t.proxy(this.enter,this)),this.$element.on(p+"."+this.type,this.options.selector,t.proxy(this.leave,this))}}this.options.selector?this._options=t.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},o.prototype.getDefaults=function(){return o.DEFAULTS},o.prototype.getOptions=function(e){return e=t.extend({},this.getDefaults(),this.$element.data(),e),e.delay&&"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},o.prototype.getDelegateOptions=function(){var e={},o=this.getDefaults();return this._options&&t.each(this._options,function(t,n){o[t]!=n&&(e[t]=n)}),e},o.prototype.enter=function(e){var o=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return o||(o=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,o)),clearTimeout(o.timeout),o.hoverState="in",o.options.delay&&o.options.delay.show?(o.timeout=setTimeout(function(){"in"==o.hoverState&&o.show()},o.options.delay.show),void 0):o.show()},o.prototype.leave=function(e){var o=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return o||(o=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,o)),clearTimeout(o.timeout),o.hoverState="out",o.options.delay&&o.options.delay.hide?(o.timeout=setTimeout(function(){"out"==o.hoverState&&o.hide()},o.options.delay.hide),void 0):o.hide()},o.prototype.show=function(){var e=t.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var o=t.contains(document.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!o)return;var n=this,i=this.tip(),r=this.getUID(this.type);this.setContent(),i.attr("id",r),this.$element.attr("aria-describedby",r),this.options.animation&&i.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,i[0],this.$element[0]):this.options.placement,a=/\s?auto?\s?/i,p=a.test(s);p&&(s=s.replace(a,"")||"top"),i.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?i.appendTo(this.options.container):i.insertAfter(this.$element);var h=this.getPosition(),l=i[0].offsetWidth,u=i[0].offsetHeight;if(p){var c=s,d=this.$element.parent(),f=this.getPosition(d);s="bottom"==s&&h.top+h.height+u-f.scroll>f.height?"top":"top"==s&&h.top-f.scroll-u<0?"bottom":"right"==s&&h.right+l>f.width?"left":"left"==s&&h.left-l<f.left?"right":s,i.removeClass(c).addClass(s)}var m=this.getCalculatedOffset(s,h,l,u);this.applyPlacement(m,s);var v=function(){n.$element.trigger("shown.bs."+n.type),n.hoverState=null};t.support.transition&&this.$tip.hasClass("fade")?i.one("bsTransitionEnd",v).emulateTransitionEnd(150):v()}},o.prototype.applyPlacement=function(e,o){var n=this.tip(),i=n[0].offsetWidth,r=n[0].offsetHeight,s=parseInt(n.css("margin-top"),10),a=parseInt(n.css("margin-left"),10);isNaN(s)&&(s=0),isNaN(a)&&(a=0),e.top=e.top+s,e.left=e.left+a,t.offset.setOffset(n[0],t.extend({using:function(t){n.css({top:Math.round(t.top),left:Math.round(t.left)})}},e),0),n.addClass("in");var p=n[0].offsetWidth,h=n[0].offsetHeight;"top"==o&&h!=r&&(e.top=e.top+r-h);var l=this.getViewportAdjustedDelta(o,e,p,h);l.left?e.left+=l.left:e.top+=l.top;var u=l.left?2*l.left-i+p:2*l.top-r+h,c=l.left?"left":"top",d=l.left?"offsetWidth":"offsetHeight";n.offset(e),this.replaceArrow(u,n[0][d],c)},o.prototype.replaceArrow=function(t,e,o){this.arrow().css(o,t?50*(1-t/e)+"%":"")},o.prototype.setContent=function(){var t=this.tip(),e=this.getTitle();t.find(".tooltip-inner")[this.options.html?"html":"text"](e),t.removeClass("fade in top bottom left right")},o.prototype.hide=function(){function e(){"in"!=o.hoverState&&n.detach(),o.$element.trigger("hidden.bs."+o.type)}var o=this,n=this.tip(),i=t.Event("hide.bs."+this.type);return this.$element.removeAttr("aria-describedby"),this.$element.trigger(i),i.isDefaultPrevented()?void 0:(n.removeClass("in"),t.support.transition&&this.$tip.hasClass("fade")?n.one("bsTransitionEnd",e).emulateTransitionEnd(150):e(),this.hoverState=null,this)},o.prototype.fixTitle=function(){var t=this.$element;(t.attr("title")||"string"!=typeof t.attr("data-original-title"))&&t.attr("data-original-title",t.attr("title")||"").attr("title","")},o.prototype.hasContent=function(){return this.getTitle()},o.prototype.getPosition=function(e){e=e||this.$element;var o=e[0],n="BODY"==o.tagName;return t.extend({},"function"==typeof o.getBoundingClientRect?o.getBoundingClientRect():null,{scroll:n?document.documentElement.scrollTop||document.body.scrollTop:e.scrollTop(),width:n?t(window).width():e.outerWidth(),height:n?t(window).height():e.outerHeight()},n?{top:0,left:0}:e.offset())},o.prototype.getCalculatedOffset=function(t,e,o,n){return"bottom"==t?{top:e.top+e.height,left:e.left+e.width/2-o/2}:"top"==t?{top:e.top-n,left:e.left+e.width/2-o/2}:"left"==t?{top:e.top+e.height/2-n/2,left:e.left-o}:{top:e.top+e.height/2-n/2,left:e.left+e.width}},o.prototype.getViewportAdjustedDelta=function(t,e,o,n){var i={top:0,left:0};if(!this.$viewport)return i;var r=this.options.viewport&&this.options.viewport.padding||0,s=this.getPosition(this.$viewport);if(/right|left/.test(t)){var a=e.top-r-s.scroll,p=e.top+r-s.scroll+n;a<s.top?i.top=s.top-a:p>s.top+s.height&&(i.top=s.top+s.height-p)}else{var h=e.left-r,l=e.left+r+o;h<s.left?i.left=s.left-h:l>s.width&&(i.left=s.left+s.width-l)}return i},o.prototype.getTitle=function(){var t,e=this.$element,o=this.options;return t=e.attr("data-original-title")||("function"==typeof o.title?o.title.call(e[0]):o.title)},o.prototype.getUID=function(t){do t+=~~(1e6*Math.random());while(document.getElementById(t));return t},o.prototype.tip=function(){return this.$tip=this.$tip||t(this.options.template)},o.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},o.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},o.prototype.enable=function(){this.enabled=!0},o.prototype.disable=function(){this.enabled=!1},o.prototype.toggleEnabled=function(){this.enabled=!this.enabled},o.prototype.toggle=function(e){var o=this;e&&(o=t(e.currentTarget).data("bs."+this.type),o||(o=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,o))),o.tip().hasClass("in")?o.leave(o):o.enter(o)},o.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var n=t.fn.tooltip;t.fn.tooltip=e,t.fn.tooltip.Constructor=o,t.fn.tooltip.noConflict=function(){return t.fn.tooltip=n,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var n=t(this),i=n.data("bs.popover"),r="object"==typeof e&&e;(i||"destroy"!=e)&&(i||n.data("bs.popover",i=new o(this,r)),"string"==typeof e&&i[e]())})}var o=function(t,e){this.init("popover",t,e)};if(!t.fn.tooltip)throw new Error("Popover requires tooltip.js");o.VERSION="3.2.0",o.DEFAULTS=t.extend({},t.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),o.prototype=t.extend({},t.fn.tooltip.Constructor.prototype),o.prototype.constructor=o,o.prototype.getDefaults=function(){return o.DEFAULTS},o.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),o=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](e),t.find(".popover-content").empty()[this.options.html?"string"==typeof o?"html":"append":"text"](o),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},o.prototype.hasContent=function(){return this.getTitle()||this.getContent()},o.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},o.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},o.prototype.tip=function(){return this.$tip||(this.$tip=t(this.options.template)),this.$tip};var n=t.fn.popover;t.fn.popover=e,t.fn.popover.Constructor=o,t.fn.popover.noConflict=function(){return t.fn.popover=n,this}}(jQuery),function(t,e){var o,n;return n=e.document,o=function(){function o(o){var n;try{n=e.localStorage}catch(i){n=!1}this._options=t.extend({name:"tour",steps:[],container:"body",autoscroll:!0,keyboard:!0,storage:n,debug:!1,backdrop:!1,backdropPadding:0,redirect:!0,orphan:!1,duration:!1,delay:!1,basePath:"",template:'<div class="popover" role="tooltip"> <div class="arrow"></div> <h3 class="popover-title"></h3> <div class="popover-content"></div> <div class="popover-navigation"> <div class="btn-group"> <button class="btn btn-sm btn-default" data-role="prev">« Prev</button> <button class="btn btn-sm btn-default" data-role="next">Next »</button> <button class="btn btn-sm btn-default" data-role="pause-resume" data-pause-text="Pause" data-resume-text="Resume">Pause</button> </div> <button class="btn btn-sm btn-default" data-role="end">End tour</button> </div> </div>',afterSetState:function(){},afterGetState:function(){},afterRemoveState:function(){},onStart:function(){},onEnd:function(){},onShow:function(){},onShown:function(){},onHide:function(){},onHidden:function(){},onNext:function(){},onPrev:function(){},onPause:function(){},onResume:function(){}},o),this._force=!1,this._inited=!1,this.backdrop={overlay:null,$element:null,$background:null,backgroundShown:!1,overlayElementShown:!1}}return o.prototype.addSteps=function(t){var e,o,n;for(o=0,n=t.length;n>o;o++)e=t[o],this.addStep(e);return this},o.prototype.addStep=function(t){return this._options.steps.push(t),this},o.prototype.getStep=function(e){return null!=this._options.steps[e]?t.extend({id:"step-"+e,path:"",placement:"right",title:"",content:"<p></p>",next:e===this._options.steps.length-1?-1:e+1,prev:e-1,animation:!0,container:this._options.container,autoscroll:this._options.autoscroll,backdrop:this._options.backdrop,backdropPadding:this._options.backdropPadding,redirect:this._options.redirect,orphan:this._options.orphan,duration:this._options.duration,delay:this._options.delay,template:this._options.template,onShow:this._options.onShow,onShown:this._options.onShown,onHide:this._options.onHide,onHidden:this._options.onHidden,onNext:this._options.onNext,onPrev:this._options.onPrev,onPause:this._options.onPause,onResume:this._options.onResume},this._options.steps[e]):void 0},o.prototype.init=function(t){return this._force=t,this.ended()?(this._debug("Tour ended, init prevented."),this):(this.setCurrentStep(),this._initMouseNavigation(),this._initKeyboardNavigation(),this._onResize(function(t){return function(){return t.showStep(t._current)}}(this)),null!==this._current&&this.showStep(this._current),this._inited=!0,this)},o.prototype.start=function(t){var e;return null==t&&(t=!1),this._inited||this.init(t),null===this._current&&(e=this._makePromise(null!=this._options.onStart?this._options.onStart(this):void 0),this._callOnPromiseDone(e,this.showStep,0)),this},o.prototype.next=function(){var t;return t=this.hideStep(this._current),this._callOnPromiseDone(t,this._showNextStep)},o.prototype.prev=function(){var t;return t=this.hideStep(this._current),this._callOnPromiseDone(t,this._showPrevStep)},o.prototype.goTo=function(t){var e;return e=this.hideStep(this._current),this._callOnPromiseDone(e,this.showStep,t)},o.prototype.end=function(){var o,i;return o=function(o){return function(){return t(n).off("click.tour-"+o._options.name),t(n).off("keyup.tour-"+o._options.name),t(e).off("resize.tour-"+o._options.name),o._setState("end","yes"),o._inited=!1,o._force=!1,o._clearTimer(),null!=o._options.onEnd?o._options.onEnd(o):void 0}}(this),i=this.hideStep(this._current),this._callOnPromiseDone(i,o)},o.prototype.ended=function(){return!this._force&&!!this._getState("end")},o.prototype.restart=function(){return this._removeState("current_step"),this._removeState("end"),this.start()},o.prototype.pause=function(){var t;return t=this.getStep(this._current),t&&t.duration?(this._paused=!0,this._duration-=(new Date).getTime()-this._start,e.clearTimeout(this._timer),this._debug("Paused/Stopped step "+(this._current+1)+" timer ("+this._duration+" remaining)."),null!=t.onPause?t.onPause(this,this._duration):void 0):this},o.prototype.resume=function(){var t;return t=this.getStep(this._current),t&&t.duration?(this._paused=!1,this._start=(new Date).getTime(),this._duration=this._duration||t.duration,this._timer=e.setTimeout(function(t){return function(){return t._isLast()?t.next():t.end()}}(this),this._duration),this._debug("Started step "+(this._current+1)+" timer with duration "+this._duration),null!=t.onResume&&this._duration!==t.duration?t.onResume(this,this._duration):void 0):this},o.prototype.hideStep=function(e){var o,n,i;return(i=this.getStep(e))?(this._clearTimer(),n=this._makePromise(null!=i.onHide?i.onHide(this,e):void 0),o=function(o){return function(){var n;return n=t(i.element),n.data("bs.popover")||n.data("popover")||(n=t("body")),n.popover("destroy").removeClass("tour-"+o._options.name+"-element tour-"+o._options.name+"-"+e+"-element"),i.reflex&&n.removeClass("tour-step-element-reflex").off(""+o._reflexEvent(i.reflex)+".tour-"+o._options.name),i.backdrop&&o._hideBackdrop(),null!=i.onHidden?i.onHidden(o):void 0}}(this),this._callOnPromiseDone(n,o),n):void 0},o.prototype.showStep=function(t){var o,i,r,s;return this.ended()?(this._debug("Tour ended, showStep prevented."),this):(s=this.getStep(t))?(r=t<this._current,o=this._makePromise(null!=s.onShow?s.onShow(this,t):void 0),i=function(e){return function(){var o,i,a;if(e.setCurrentStep(t),i=function(){switch({}.toString.call(s.path)){case"[object Function]":return s.path();case"[object String]":return this._options.basePath+s.path;default:return s.path}}.call(e),o=[n.location.pathname,n.location.hash].join(""),e._isRedirect(i,o))return e._redirect(s,i),void 0;if(e._isOrphan(s)){if(!s.orphan)return e._debug("Skip the orphan step "+(e._current+1)+".\nOrphan option is false and the element does not exist or is hidden."),r?e._showPrevStep():e._showNextStep(),void 0;e._debug("Show the orphan step "+(e._current+1)+". Orphans option is true.")}return s.backdrop&&e._showBackdrop(e._isOrphan(s)?void 0:s.element),a=function(){return e.getCurrentStep()===t?(null!=s.element&&s.backdrop&&e._showOverlayElement(s),e._showPopover(s,t),null!=s.onShown&&s.onShown(e),e._debug("Step "+(e._current+1)+" of "+e._options.steps.length)):void 0},s.autoscroll?e._scrollIntoView(s.element,a):a(),s.duration?e.resume():void 0}}(this),s.delay?(this._debug("Wait "+s.delay+" milliseconds to show the step "+(this._current+1)),e.setTimeout(function(t){return function(){return t._callOnPromiseDone(o,i)}}(this),s.delay)):this._callOnPromiseDone(o,i),o):void 0},o.prototype.getCurrentStep=function(){return this._current},o.prototype.setCurrentStep=function(t){return null!=t?(this._current=t,this._setState("current_step",t)):(this._current=this._getState("current_step"),this._current=null===this._current?null:parseInt(this._current,10)),this},o.prototype._setState=function(t,e){var o,n;if(this._options.storage){n=""+this._options.name+"_"+t;try{this._options.storage.setItem(n,e)}catch(i){o=i,o.code===DOMException.QUOTA_EXCEEDED_ERR&&this.debug("LocalStorage quota exceeded. State storage failed.")}return this._options.afterSetState(n,e)}return null==this._state&&(this._state={}),this._state[t]=e},o.prototype._removeState=function(t){var e;return this._options.storage?(e=""+this._options.name+"_"+t,this._options.storage.removeItem(e),this._options.afterRemoveState(e)):null!=this._state?delete this._state[t]:void 0},o.prototype._getState=function(t){var e,o;return this._options.storage?(e=""+this._options.name+"_"+t,o=this._options.storage.getItem(e)):null!=this._state&&(o=this._state[t]),(void 0===o||"null"===o)&&(o=null),this._options.afterGetState(t,o),o},o.prototype._showNextStep=function(){var t,e,o;return o=this.getStep(this._current),e=function(t){return function(){return t.showStep(o.next)}}(this),t=this._makePromise(null!=o.onNext?o.onNext(this):void 0),this._callOnPromiseDone(t,e)},o.prototype._showPrevStep=function(){var t,e,o;return o=this.getStep(this._current),e=function(t){return function(){return t.showStep(o.prev)}}(this),t=this._makePromise(null!=o.onPrev?o.onPrev(this):void 0),this._callOnPromiseDone(t,e)},o.prototype._debug=function(t){return this._options.debug?e.console.log("Bootstrap Tour '"+this._options.name+"' | "+t):void 0},o.prototype._isRedirect=function(t,e){return null!=t&&""!==t&&("[object RegExp]"==={}.toString.call(t)&&!t.test(e)||"[object String]"==={}.toString.call(t)&&t.replace(/\?.*$/,"").replace(/\/?$/,"")!==e.replace(/\/?$/,""))},o.prototype._redirect=function(e,o){return t.isFunction(e.redirect)?e.redirect.call(this,o):e.redirect===!0?(this._debug("Redirect to "+o),n.location.href=o):void 0},o.prototype._isOrphan=function(e){return null==e.element||!t(e.element).length||t(e.element).is(":hidden")&&"http://www.w3.org/2000/svg"!==t(e.element)[0].namespaceURI},o.prototype._isLast=function(){return this._current<this._options.steps.length-1},o.prototype._showPopover=function(e,o){var n,i,r,s;return t(".tour-"+this._options.name).remove(),s=t.extend({},this._options),r=this._isOrphan(e),e.template=this._template(e,o),r&&(e.element="body",e.placement="top"),n=t(e.element),n.addClass("tour-"+this._options.name+"-element tour-"+this._options.name+"-"+o+"-element"),e.options&&t.extend(s,e.options),e.reflex&&!r&&(n.addClass("tour-step-element-reflex"),n.off(""+this._reflexEvent(e.reflex)+".tour-"+this._options.name),n.on(""+this._reflexEvent(e.reflex)+".tour-"+this._options.name,function(t){return function(){return t._isLast()?t.next():t.end()}}(this))),n.popover({placement:e.placement,trigger:"manual",title:e.title,content:e.content,html:!0,animation:e.animation,container:e.container,template:e.template,selector:e.element}).popover("show"),i=n.data("bs.popover")?n.data("bs.popover").tip():n.data("popover").tip(),i.attr("id",e.id),this._reposition(i,e),r?this._center(i):void 0},o.prototype._template=function(e,o){var n,i,r,s;return s=t.isFunction(e.template)?t(e.template(o,e)):t(e.template),n=s.find(".popover-navigation"),r=n.find('[data-role="prev"]'),i=n.find('[data-role="next"]'),this._isOrphan(e)&&s.addClass("orphan"),s.addClass("tour-"+this._options.name+" tour-"+this._options.name+"-"+o),e.prev<0&&n.find('[data-role="prev"]').addClass("disabled"),e.next<0&&n.find('[data-role="next"]').addClass("disabled"),e.duration||n.find('[data-role="pause-resume"]').remove(),s.clone().wrap("<div>").parent().html()},o.prototype._reflexEvent=function(t){return"[object Boolean]"==={}.toString.call(t)?"click":t},o.prototype._reposition=function(e,o){var i,r,s,a,p,h,l;if(a=e[0].offsetWidth,r=e[0].offsetHeight,l=e.offset(),p=l.left,h=l.top,i=t(n).outerHeight()-l.top-e.outerHeight(),0>i&&(l.top=l.top+i),s=t("html").outerWidth()-l.left-e.outerWidth(),0>s&&(l.left=l.left+s),l.top<0&&(l.top=0),l.left<0&&(l.left=0),e.offset(l),"bottom"===o.placement||"top"===o.placement){if(p!==l.left)return this._replaceArrow(e,2*(l.left-p),a,"left")}else if(h!==l.top)return this._replaceArrow(e,2*(l.top-h),r,"top")},o.prototype._center=function(o){return o.css("top",t(e).outerHeight()/2-o.outerHeight()/2)},o.prototype._replaceArrow=function(t,e,o,n){return t.find(".arrow").css(n,e?50*(1-e/o)+"%":"")},o.prototype._scrollIntoView=function(o,n){var i,r,s,a,p,h;return i=t(o),i.length?(r=t(e),a=i.offset().top,h=r.height(),p=Math.max(0,a-h/2),this._debug("Scroll into view. ScrollTop: "+p+". Element offset: "+a+". Window height: "+h+"."),s=0,t("body, html").stop(!0,!0).animate({scrollTop:Math.ceil(p)},function(t){return function(){return 2===++s?(n(),t._debug("Scroll into view.\nAnimation end element offset: "+i.offset().top+".\nWindow height: "+r.height()+".")):void 0}}(this))):n()},o.prototype._onResize=function(o,n){return t(e).on("resize.tour-"+this._options.name,function(){return clearTimeout(n),n=setTimeout(o,100)})},o.prototype._initMouseNavigation=function(){var e;return e=this,t(n).off("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='prev']").off("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='next']").off("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='end']").off("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='pause-resume']").on("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='next']",function(t){return function(e){return e.preventDefault(),t.next()}}(this)).on("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='prev']",function(t){return function(e){return e.preventDefault(),t.prev()}}(this)).on("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='end']",function(t){return function(e){return e.preventDefault(),t.end()}}(this)).on("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='pause-resume']",function(o){var n;return o.preventDefault(),n=t(this),n.text(e._paused?n.data("pause-text"):n.data("resume-text")),e._paused?e.resume():e.pause()})},o.prototype._initKeyboardNavigation=function(){return this._options.keyboard?t(n).on("keyup.tour-"+this._options.name,function(t){return function(e){if(e.which)switch(e.which){case 39:return e.preventDefault(),t._isLast()?t.next():t.end();case 37:if(e.preventDefault(),t._current>0)return t.prev();break;case 27:return e.preventDefault(),t.end()}}}(this)):void 0},o.prototype._makePromise=function(e){return e&&t.isFunction(e.then)?e:null},o.prototype._callOnPromiseDone=function(t,e,o){return t?t.then(function(t){return function(){return e.call(t,o)}}(this)):e.call(this,o)},o.prototype._showBackdrop=function(){return this.backdrop.backgroundShown?void 0:(this.backdrop=t("<div>",{"class":"tour-backdrop"}),this.backdrop.backgroundShown=!0,t("body").append(this.backdrop))},o.prototype._hideBackdrop=function(){return this._hideOverlayElement(),this._hideBackground()},o.prototype._hideBackground=function(){return this.backdrop?(this.backdrop.remove(),this.backdrop.overlay=null,this.backdrop.backgroundShown=!1):void 0},o.prototype._showOverlayElement=function(e){var o,n;return o=t(e.element),o&&0!==o.length&&!this.backdrop.overlayElementShown?(this.backdrop.overlayElementShown=!0,this.backdrop.$element=o.addClass("tour-step-backdrop"),this.backdrop.$background=t("<div>",{"class":"tour-step-background"}),n={width:o.innerWidth(),height:o.innerHeight(),offset:o.offset()},this.backdrop.$background.appendTo("body"),e.backdropPadding&&(n=this._applyBackdropPadding(e.backdropPadding,n)),this.backdrop.$background.width(n.width).height(n.height).offset(n.offset)):void 0},o.prototype._hideOverlayElement=function(){return this.backdrop.overlayElementShown?(this.backdrop.$element.removeClass("tour-step-backdrop"),this.backdrop.$background.remove(),this.backdrop.$element=null,this.backdrop.$background=null,this.backdrop.overlayElementShown=!1):void 0},o.prototype._applyBackdropPadding=function(t,e){return"object"==typeof t?(null==t.top&&(t.top=0),null==t.right&&(t.right=0),null==t.bottom&&(t.bottom=0),null==t.left&&(t.left=0),e.offset.top=e.offset.top-t.top,e.offset.left=e.offset.left-t.left,e.width=e.width+t.left+t.right,e.height=e.height+t.top+t.bottom):(e.offset.top=e.offset.top-t,e.offset.left=e.offset.left-t,e.width=e.width+2*t,e.height=e.height+2*t),e},o.prototype._clearTimer=function(){return e.clearTimeout(this._timer),this._timer=null,this._duration=null},o}(),e.Tour=o}(jQuery,window);</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/bootstrap.min.js b/ipynb/Array-feature-overlap-05_files/bootstrap.min.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..d839865</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/bootstrap.min.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>/*!</span> <span class='diff-add'> * Bootstrap v3.3.1 (http://getbootstrap.com)</span> <span class='diff-add'> * Copyright 2011-2014 Twitter, Inc.</span> <span class='diff-add'> * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)</span> <span class='diff-add'> */</span> <span class='diff-add'>if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.1",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.1",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.1",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c="prev"==a?-1:1,d=this.getItemIndex(b),e=(d+c)%this.$items.length;return this.$items.eq(e)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i="next"==b?"first":"last",j=this;if(!f.length){if(!this.options.wrap)return;f=this.$element.find(".item")[i]()}if(f.hasClass("active"))return this.sliding=!1;var k=f[0],l=a.Event("slide.bs.carousel",{relatedTarget:k,direction:h});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var m=a(this.$indicators.children()[this.getItemIndex(f)]);m&&m.addClass("active")}var n=a.Event("slid.bs.carousel",{relatedTarget:k,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),j.sliding=!1,setTimeout(function(){j.$element.trigger(n)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(n)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.1",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.find("> .panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.1",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.1",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.options.backdrop&&d.adjustBackdrop(),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in").attr("aria-hidden",!1),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$element.find(".modal-dialog").one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a('<div class="modal-backdrop '+e+'" />').prependTo(this.$element).on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.options.backdrop&&this.adjustBackdrop(),this.adjustDialog()},c.prototype.adjustBackdrop=function(){this.$backdrop.css("height",0).css("height",this.$element[0].scrollHeight)},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){this.bodyIsOverflowing=document.body.scrollHeight>document.documentElement.clientHeight,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b,g=f&&f.selector;(e||"destroy"!=b)&&(g?(e||d.data("bs.tooltip",e={}),e[g]||(e[g]=new c(this,f))):e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.1",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m<p.top?"bottom":"right"==h&&k.right+l>p.width?"left":"left"==h&&k.left-l<p.left?"right":h,f.removeClass(n).addClass(h)}var q=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(q,h);var r=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",r).emulateTransitionEnd(c.TRANSITION_DURATION):r()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=this.tip(),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b,g=f&&f.selector;(e||"destroy"!=b)&&(g?(e||d.data("bs.popover",e={}),e[g]||(e[g]=new c(this,f))):e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.1",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.1",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.1",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})</span> <span class='diff-add'>})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.1",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=i?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a("body").height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/cell.js b/ipynb/Array-feature-overlap-05_files/cell.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..1f8f8e1</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/cell.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>/**</span> <span class='diff-add'> *</span> <span class='diff-add'> *</span> <span class='diff-add'> * @module cell</span> <span class='diff-add'> * @namespace cell</span> <span class='diff-add'> * @class Cell</span> <span class='diff-add'> */</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> 'codemirror/lib/codemirror',</span> <span class='diff-add'> 'codemirror/addon/edit/matchbrackets',</span> <span class='diff-add'> 'codemirror/addon/edit/closebrackets',</span> <span class='diff-add'> 'codemirror/addon/comment/comment'</span> <span class='diff-add'>], function(IPython, $, utils, CodeMirror, cm_match, cm_closeb, cm_comment) {</span> <span class='diff-add'> // TODO: remove IPython dependency here </span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> </span> <span class='diff-add'> var overlayHack = CodeMirror.scrollbarModel.native.prototype.overlayHack;</span> <span class='diff-add'> </span> <span class='diff-add'> CodeMirror.scrollbarModel.native.prototype.overlayHack = function () {</span> <span class='diff-add'> overlayHack.apply(this, arguments);</span> <span class='diff-add'> // Reverse `min-height: 18px` scrollbar hack on OS X</span> <span class='diff-add'> // which causes a dead area, making it impossible to click on the last line</span> <span class='diff-add'> // when there is horizontal scrolling to do and the "show scrollbar only when scrolling" behavior</span> <span class='diff-add'> // is enabled.</span> <span class='diff-add'> // This, in turn, has the undesirable behavior of never showing the horizontal scrollbar,</span> <span class='diff-add'> // even when it should, which is less problematic, at least.</span> <span class='diff-add'> if (/Mac/.test(navigator.platform)) {</span> <span class='diff-add'> this.horiz.style.minHeight = "";</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var Cell = function (options) {</span> <span class='diff-add'> /* Constructor</span> <span class='diff-add'> *</span> <span class='diff-add'> * The Base `Cell` class from which to inherit.</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param:</span> <span class='diff-add'> * options: dictionary</span> <span class='diff-add'> * Dictionary of keyword arguments.</span> <span class='diff-add'> * events: $(Events) instance</span> <span class='diff-add'> * config: dictionary</span> <span class='diff-add'> * keyboard_manager: KeyboardManager instance</span> <span class='diff-add'> */</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> this.keyboard_manager = options.keyboard_manager;</span> <span class='diff-add'> this.events = options.events;</span> <span class='diff-add'> var config = utils.mergeopt(Cell, options.config);</span> <span class='diff-add'> // superclass default overwrite our default</span> <span class='diff-add'> </span> <span class='diff-add'> this.placeholder = config.placeholder || '';</span> <span class='diff-add'> this.read_only = config.cm_config.readOnly;</span> <span class='diff-add'> this.selected = false;</span> <span class='diff-add'> this.rendered = false;</span> <span class='diff-add'> this.mode = 'command';</span> <span class='diff-add'> // Metadata property</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this._metadata = {};</span> <span class='diff-add'> Object.defineProperty(this, 'metadata', {</span> <span class='diff-add'> get: function() { return that._metadata; },</span> <span class='diff-add'> set: function(value) {</span> <span class='diff-add'> that._metadata = value;</span> <span class='diff-add'> if (that.celltoolbar) {</span> <span class='diff-add'> that.celltoolbar.rebuild();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> // load this from metadata later ?</span> <span class='diff-add'> this.user_highlight = 'auto';</span> <span class='diff-add'> this.cm_config = config.cm_config;</span> <span class='diff-add'> this.cell_id = utils.uuid();</span> <span class='diff-add'> this._options = config;</span> <span class='diff-add'> // For JS VM engines optimization, attributes should be all set (even</span> <span class='diff-add'> // to null) in the constructor, and if possible, if different subclass</span> <span class='diff-add'> // have new attributes with same name, they should be created in the</span> <span class='diff-add'> // same order. Easiest is to create and set to null in parent class.</span> <span class='diff-add'> this.element = null;</span> <span class='diff-add'> this.cell_type = this.cell_type || null;</span> <span class='diff-add'> this.code_mirror = null;</span> <span class='diff-add'> this.create_element();</span> <span class='diff-add'> if (this.element !== null) {</span> <span class='diff-add'> this.element.data("cell", this);</span> <span class='diff-add'> this.bind_events();</span> <span class='diff-add'> this.init_classes();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> Cell.options_default = {</span> <span class='diff-add'> cm_config : {</span> <span class='diff-add'> indentUnit : 4,</span> <span class='diff-add'> readOnly: false,</span> <span class='diff-add'> theme: "default",</span> <span class='diff-add'> extraKeys: {</span> <span class='diff-add'> "Cmd-Right":"goLineRight",</span> <span class='diff-add'> "End":"goLineRight",</span> <span class='diff-add'> "Cmd-Left":"goLineLeft"</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> // FIXME: Workaround CM Bug #332 (Safari segfault on drag)</span> <span class='diff-add'> // by disabling drag/drop altogether on Safari</span> <span class='diff-add'> // https://github.com/codemirror/CodeMirror/issues/332 </span> <span class='diff-add'> if (utils.browser[0] == "Safari") {</span> <span class='diff-add'> Cell.options_default.cm_config.dragDrop = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Empty. Subclasses must implement create_element.</span> <span class='diff-add'> * This should contain all the code to create the DOM element in notebook</span> <span class='diff-add'> * and will be called by Base Class constructor.</span> <span class='diff-add'> * @method create_element</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.create_element = function () {</span> <span class='diff-add'> };</span> <span class='diff-add'> Cell.prototype.init_classes = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Call after this.element exists to initialize the css classes</span> <span class='diff-add'> * related to selected, rendered and mode.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (this.selected) {</span> <span class='diff-add'> this.element.addClass('selected');</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.element.addClass('unselected');</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.rendered) {</span> <span class='diff-add'> this.element.addClass('rendered');</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.element.addClass('unrendered');</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Subclasses can implement override bind_events.</span> <span class='diff-add'> * Be carefull to call the parent method when overwriting as it fires event.</span> <span class='diff-add'> * this will be triggerd after create_element in constructor.</span> <span class='diff-add'> * @method bind_events</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.bind_events = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> // We trigger events so that Cell doesn't have to depend on Notebook.</span> <span class='diff-add'> that.element.click(function (event) {</span> <span class='diff-add'> if (!that.selected) {</span> <span class='diff-add'> that.events.trigger('select.Cell', {'cell':that});</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> that.element.focusin(function (event) {</span> <span class='diff-add'> if (!that.selected) {</span> <span class='diff-add'> that.events.trigger('select.Cell', {'cell':that});</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> if (this.code_mirror) {</span> <span class='diff-add'> this.code_mirror.on("change", function(cm, change) {</span> <span class='diff-add'> that.events.trigger("set_dirty.Notebook", {value: true});</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.code_mirror) {</span> <span class='diff-add'> this.code_mirror.on('focus', function(cm, change) {</span> <span class='diff-add'> that.events.trigger('edit_mode.Cell', {cell: that});</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.code_mirror) {</span> <span class='diff-add'> this.code_mirror.on('blur', function(cm, change) {</span> <span class='diff-add'> that.events.trigger('command_mode.Cell', {cell: that});</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> this.element.dblclick(function () {</span> <span class='diff-add'> if (that.selected === false) {</span> <span class='diff-add'> this.events.trigger('select.Cell', {'cell':that});</span> <span class='diff-add'> }</span> <span class='diff-add'> var cont = that.unrender();</span> <span class='diff-add'> if (cont) {</span> <span class='diff-add'> that.focus_editor();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * This method gets called in CodeMirror's onKeyDown/onKeyPress</span> <span class='diff-add'> * handlers and is used to provide custom key handling.</span> <span class='diff-add'> *</span> <span class='diff-add'> * To have custom handling, subclasses should override this method, but still call it</span> <span class='diff-add'> * in order to process the Edit mode keyboard shortcuts.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method handle_codemirror_keyevent</span> <span class='diff-add'> * @param {CodeMirror} editor - The codemirror instance bound to the cell</span> <span class='diff-add'> * @param {event} event - key press event which either should or should not be handled by CodeMirror</span> <span class='diff-add'> * @return {Boolean} `true` if CodeMirror should ignore the event, `false` Otherwise</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.handle_codemirror_keyevent = function (editor, event) {</span> <span class='diff-add'> var shortcuts = this.keyboard_manager.edit_shortcuts;</span> <span class='diff-add'> var cur = editor.getCursor();</span> <span class='diff-add'> if((cur.line !== 0 || cur.ch !==0) && event.keyCode === 38){</span> <span class='diff-add'> event._ipkmIgnore = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> var nLastLine = editor.lastLine();</span> <span class='diff-add'> if ((event.keyCode === 40) &&</span> <span class='diff-add'> ((cur.line !== nLastLine) ||</span> <span class='diff-add'> (cur.ch !== editor.getLineHandle(nLastLine).text.length))</span> <span class='diff-add'> ) {</span> <span class='diff-add'> event._ipkmIgnore = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> // if this is an edit_shortcuts shortcut, the global keyboard/shortcut</span> <span class='diff-add'> // manager will handle it</span> <span class='diff-add'> if (shortcuts.handles(event)) {</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> return false;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Triger typsetting of math by mathjax on current cell element</span> <span class='diff-add'> * @method typeset</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.typeset = function () {</span> <span class='diff-add'> utils.typeset(this.element);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * handle cell level logic when a cell is selected</span> <span class='diff-add'> * @method select</span> <span class='diff-add'> * @return is the action being taken</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.select = function () {</span> <span class='diff-add'> if (!this.selected) {</span> <span class='diff-add'> this.element.addClass('selected');</span> <span class='diff-add'> this.element.removeClass('unselected');</span> <span class='diff-add'> this.selected = true;</span> <span class='diff-add'> return true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * handle cell level logic when a cell is unselected</span> <span class='diff-add'> * @method unselect</span> <span class='diff-add'> * @return is the action being taken</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.unselect = function () {</span> <span class='diff-add'> if (this.selected) {</span> <span class='diff-add'> this.element.addClass('unselected');</span> <span class='diff-add'> this.element.removeClass('selected');</span> <span class='diff-add'> this.selected = false;</span> <span class='diff-add'> return true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * should be overritten by subclass</span> <span class='diff-add'> * @method execute</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.execute = function () {</span> <span class='diff-add'> return;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * handle cell level logic when a cell is rendered</span> <span class='diff-add'> * @method render</span> <span class='diff-add'> * @return is the action being taken</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.render = function () {</span> <span class='diff-add'> if (!this.rendered) {</span> <span class='diff-add'> this.element.addClass('rendered');</span> <span class='diff-add'> this.element.removeClass('unrendered');</span> <span class='diff-add'> this.rendered = true;</span> <span class='diff-add'> return true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * handle cell level logic when a cell is unrendered</span> <span class='diff-add'> * @method unrender</span> <span class='diff-add'> * @return is the action being taken</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.unrender = function () {</span> <span class='diff-add'> if (this.rendered) {</span> <span class='diff-add'> this.element.addClass('unrendered');</span> <span class='diff-add'> this.element.removeClass('rendered');</span> <span class='diff-add'> this.rendered = false;</span> <span class='diff-add'> return true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Delegates keyboard shortcut handling to either IPython keyboard</span> <span class='diff-add'> * manager when in command mode, or CodeMirror when in edit mode</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method handle_keyevent</span> <span class='diff-add'> * @param {CodeMirror} editor - The codemirror instance bound to the cell</span> <span class='diff-add'> * @param {event} - key event to be handled</span> <span class='diff-add'> * @return {Boolean} `true` if CodeMirror should ignore the event, `false` Otherwise</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.handle_keyevent = function (editor, event) {</span> <span class='diff-add'> if (this.mode === 'command') {</span> <span class='diff-add'> return true;</span> <span class='diff-add'> } else if (this.mode === 'edit') {</span> <span class='diff-add'> return this.handle_codemirror_keyevent(editor, event);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @method at_top</span> <span class='diff-add'> * @return {Boolean}</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.at_top = function () {</span> <span class='diff-add'> var cm = this.code_mirror;</span> <span class='diff-add'> var cursor = cm.getCursor();</span> <span class='diff-add'> if (cursor.line === 0 && cursor.ch === 0) {</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> return false;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @method at_bottom</span> <span class='diff-add'> * @return {Boolean}</span> <span class='diff-add'> * */</span> <span class='diff-add'> Cell.prototype.at_bottom = function () {</span> <span class='diff-add'> var cm = this.code_mirror;</span> <span class='diff-add'> var cursor = cm.getCursor();</span> <span class='diff-add'> if (cursor.line === (cm.lineCount()-1) && cursor.ch === cm.getLine(cursor.line).length) {</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> return false;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * enter the command mode for the cell</span> <span class='diff-add'> * @method command_mode</span> <span class='diff-add'> * @return is the action being taken</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.command_mode = function () {</span> <span class='diff-add'> if (this.mode !== 'command') {</span> <span class='diff-add'> this.mode = 'command';</span> <span class='diff-add'> return true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * enter the edit mode for the cell</span> <span class='diff-add'> * @method command_mode</span> <span class='diff-add'> * @return is the action being taken</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.edit_mode = function () {</span> <span class='diff-add'> if (this.mode !== 'edit') {</span> <span class='diff-add'> this.mode = 'edit';</span> <span class='diff-add'> return true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Focus the cell in the DOM sense</span> <span class='diff-add'> * @method focus_cell</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.focus_cell = function () {</span> <span class='diff-add'> this.element.focus();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Focus the editor area so a user can type</span> <span class='diff-add'> *</span> <span class='diff-add'> * NOTE: If codemirror is focused via a mouse click event, you don't want to</span> <span class='diff-add'> * call this because it will cause a page jump.</span> <span class='diff-add'> * @method focus_editor</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.focus_editor = function () {</span> <span class='diff-add'> this.refresh();</span> <span class='diff-add'> this.code_mirror.focus();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Refresh codemirror instance</span> <span class='diff-add'> * @method refresh</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.refresh = function () {</span> <span class='diff-add'> if (this.code_mirror) {</span> <span class='diff-add'> this.code_mirror.refresh();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * should be overritten by subclass</span> <span class='diff-add'> * @method get_text</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.get_text = function () {</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * should be overritten by subclass</span> <span class='diff-add'> * @method set_text</span> <span class='diff-add'> * @param {string} text</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.set_text = function (text) {</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * should be overritten by subclass</span> <span class='diff-add'> * serialise cell to json.</span> <span class='diff-add'> * @method toJSON</span> <span class='diff-add'> **/</span> <span class='diff-add'> Cell.prototype.toJSON = function () {</span> <span class='diff-add'> var data = {};</span> <span class='diff-add'> // deepcopy the metadata so copied cells don't share the same object</span> <span class='diff-add'> data.metadata = JSON.parse(JSON.stringify(this.metadata));</span> <span class='diff-add'> data.cell_type = this.cell_type;</span> <span class='diff-add'> return data;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * should be overritten by subclass</span> <span class='diff-add'> * @method fromJSON</span> <span class='diff-add'> **/</span> <span class='diff-add'> Cell.prototype.fromJSON = function (data) {</span> <span class='diff-add'> if (data.metadata !== undefined) {</span> <span class='diff-add'> this.metadata = data.metadata;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * can the cell be split into two cells (false if not deletable)</span> <span class='diff-add'> * @method is_splittable</span> <span class='diff-add'> **/</span> <span class='diff-add'> Cell.prototype.is_splittable = function () {</span> <span class='diff-add'> return this.is_deletable();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * can the cell be merged with other cells (false if not deletable)</span> <span class='diff-add'> * @method is_mergeable</span> <span class='diff-add'> **/</span> <span class='diff-add'> Cell.prototype.is_mergeable = function () {</span> <span class='diff-add'> return this.is_deletable();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * is the cell deletable? only false (undeletable) if</span> <span class='diff-add'> * metadata.deletable is explicitly false -- everything else</span> <span class='diff-add'> * counts as true</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method is_deletable</span> <span class='diff-add'> **/</span> <span class='diff-add'> Cell.prototype.is_deletable = function () {</span> <span class='diff-add'> if (this.metadata.deletable === false) {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> return true;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @return {String} - the text before the cursor</span> <span class='diff-add'> * @method get_pre_cursor</span> <span class='diff-add'> **/</span> <span class='diff-add'> Cell.prototype.get_pre_cursor = function () {</span> <span class='diff-add'> var cursor = this.code_mirror.getCursor();</span> <span class='diff-add'> var text = this.code_mirror.getRange({line:0, ch:0}, cursor);</span> <span class='diff-add'> text = text.replace(/^\n+/, '').replace(/\n+$/, '');</span> <span class='diff-add'> return text;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @return {String} - the text after the cursor</span> <span class='diff-add'> * @method get_post_cursor</span> <span class='diff-add'> **/</span> <span class='diff-add'> Cell.prototype.get_post_cursor = function () {</span> <span class='diff-add'> var cursor = this.code_mirror.getCursor();</span> <span class='diff-add'> var last_line_num = this.code_mirror.lineCount()-1;</span> <span class='diff-add'> var last_line_len = this.code_mirror.getLine(last_line_num).length;</span> <span class='diff-add'> var end = {line:last_line_num, ch:last_line_len};</span> <span class='diff-add'> var text = this.code_mirror.getRange(cursor, end);</span> <span class='diff-add'> text = text.replace(/^\n+/, '').replace(/\n+$/, '');</span> <span class='diff-add'> return text;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Show/Hide CodeMirror LineNumber</span> <span class='diff-add'> * @method show_line_numbers</span> <span class='diff-add'> *</span> <span class='diff-add'> * @param value {Bool} show (true), or hide (false) the line number in CodeMirror</span> <span class='diff-add'> **/</span> <span class='diff-add'> Cell.prototype.show_line_numbers = function (value) {</span> <span class='diff-add'> this.code_mirror.setOption('lineNumbers', value);</span> <span class='diff-add'> this.code_mirror.refresh();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Toggle CodeMirror LineNumber</span> <span class='diff-add'> * @method toggle_line_numbers</span> <span class='diff-add'> **/</span> <span class='diff-add'> Cell.prototype.toggle_line_numbers = function () {</span> <span class='diff-add'> var val = this.code_mirror.getOption('lineNumbers');</span> <span class='diff-add'> this.show_line_numbers(!val);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Force codemirror highlight mode</span> <span class='diff-add'> * @method force_highlight</span> <span class='diff-add'> * @param {object} - CodeMirror mode</span> <span class='diff-add'> **/</span> <span class='diff-add'> Cell.prototype.force_highlight = function(mode) {</span> <span class='diff-add'> this.user_highlight = mode;</span> <span class='diff-add'> this.auto_highlight();</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Trigger autodetection of highlight scheme for current cell</span> <span class='diff-add'> * @method auto_highlight</span> <span class='diff-add'> */</span> <span class='diff-add'> Cell.prototype.auto_highlight = function () {</span> <span class='diff-add'> this._auto_highlight(this.class_config.get_sync('highlight_modes'));</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Try to autodetect cell highlight mode, or use selected mode</span> <span class='diff-add'> * @methods _auto_highlight</span> <span class='diff-add'> * @private</span> <span class='diff-add'> * @param {String|object|undefined} - CodeMirror mode | 'auto'</span> <span class='diff-add'> **/</span> <span class='diff-add'> Cell.prototype._auto_highlight = function (modes) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> *Here we handle manually selected modes</span> <span class='diff-add'> */</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var mode;</span> <span class='diff-add'> if( this.user_highlight !== undefined && this.user_highlight != 'auto' )</span> <span class='diff-add'> {</span> <span class='diff-add'> mode = this.user_highlight;</span> <span class='diff-add'> CodeMirror.autoLoadMode(this.code_mirror, mode);</span> <span class='diff-add'> this.code_mirror.setOption('mode', mode);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var current_mode = this.code_mirror.getOption('mode', mode);</span> <span class='diff-add'> var first_line = this.code_mirror.getLine(0);</span> <span class='diff-add'> // loop on every pairs</span> <span class='diff-add'> for(mode in modes) {</span> <span class='diff-add'> var regs = modes[mode].reg;</span> <span class='diff-add'> // only one key every time but regexp can't be keys...</span> <span class='diff-add'> for(var i=0; i<regs.length; i++) {</span> <span class='diff-add'> // here we handle non magic_modes</span> <span class='diff-add'> if(first_line.match(regs[i]) !== null) {</span> <span class='diff-add'> if(current_mode == mode){</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (mode.search('magic_') !== 0) {</span> <span class='diff-add'> utils.requireCodeMirrorMode(mode, function (spec) {</span> <span class='diff-add'> that.code_mirror.setOption('mode', spec);</span> <span class='diff-add'> });</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var open = modes[mode].open || "%%";</span> <span class='diff-add'> var close = modes[mode].close || "%%end";</span> <span class='diff-add'> var magic_mode = mode;</span> <span class='diff-add'> mode = magic_mode.substr(6);</span> <span class='diff-add'> if(current_mode == magic_mode){</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> utils.requireCodeMirrorMode(mode, function (spec) {</span> <span class='diff-add'> // create on the fly a mode that switch between</span> <span class='diff-add'> // plain/text and something else, otherwise `%%` is</span> <span class='diff-add'> // source of some highlight issues.</span> <span class='diff-add'> CodeMirror.defineMode(magic_mode, function(config) {</span> <span class='diff-add'> return CodeMirror.multiplexingMode(</span> <span class='diff-add'> CodeMirror.getMode(config, 'text/plain'),</span> <span class='diff-add'> // always set something on close</span> <span class='diff-add'> {open: open, close: close,</span> <span class='diff-add'> mode: CodeMirror.getMode(config, spec),</span> <span class='diff-add'> delimStyle: "delimit"</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> });</span> <span class='diff-add'> that.code_mirror.setOption('mode', magic_mode);</span> <span class='diff-add'> });</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // fallback on default</span> <span class='diff-add'> var default_mode;</span> <span class='diff-add'> try {</span> <span class='diff-add'> default_mode = this._options.cm_config.mode;</span> <span class='diff-add'> } catch(e) {</span> <span class='diff-add'> default_mode = 'text/plain';</span> <span class='diff-add'> }</span> <span class='diff-add'> if( current_mode === default_mode){</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.code_mirror.setOption('mode', default_mode);</span> <span class='diff-add'> };</span> <span class='diff-add'> var UnrecognizedCell = function (options) {</span> <span class='diff-add'> /** Constructor for unrecognized cells */</span> <span class='diff-add'> Cell.apply(this, arguments);</span> <span class='diff-add'> this.cell_type = 'unrecognized';</span> <span class='diff-add'> this.celltoolbar = null;</span> <span class='diff-add'> this.data = {};</span> <span class='diff-add'> </span> <span class='diff-add'> Object.seal(this);</span> <span class='diff-add'> };</span> <span class='diff-add'> UnrecognizedCell.prototype = Object.create(Cell.prototype);</span> <span class='diff-add'> </span> <span class='diff-add'> </span> <span class='diff-add'> // cannot merge or split unrecognized cells</span> <span class='diff-add'> UnrecognizedCell.prototype.is_mergeable = function () {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> UnrecognizedCell.prototype.is_splittable = function () {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> UnrecognizedCell.prototype.toJSON = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * deepcopy the metadata so copied cells don't share the same object</span> <span class='diff-add'> */</span> <span class='diff-add'> return JSON.parse(JSON.stringify(this.data));</span> <span class='diff-add'> };</span> <span class='diff-add'> UnrecognizedCell.prototype.fromJSON = function (data) {</span> <span class='diff-add'> this.data = data;</span> <span class='diff-add'> if (data.metadata !== undefined) {</span> <span class='diff-add'> this.metadata = data.metadata;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> data.metadata = this.metadata;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.element.find('.inner_cell').find("a").text("Unrecognized cell type: " + data.cell_type);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> UnrecognizedCell.prototype.create_element = function () {</span> <span class='diff-add'> Cell.prototype.create_element.apply(this, arguments);</span> <span class='diff-add'> var cell = this.element = $("<div>").addClass('cell unrecognized_cell');</span> <span class='diff-add'> cell.attr('tabindex','2');</span> <span class='diff-add'> var prompt = $('<div/>').addClass('prompt input_prompt');</span> <span class='diff-add'> cell.append(prompt);</span> <span class='diff-add'> var inner_cell = $('<div/>').addClass('inner_cell');</span> <span class='diff-add'> inner_cell.append(</span> <span class='diff-add'> $("<a>")</span> <span class='diff-add'> .attr("href", "#")</span> <span class='diff-add'> .text("Unrecognized cell type")</span> <span class='diff-add'> );</span> <span class='diff-add'> cell.append(inner_cell);</span> <span class='diff-add'> this.element = cell;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> UnrecognizedCell.prototype.bind_events = function () {</span> <span class='diff-add'> Cell.prototype.bind_events.apply(this, arguments);</span> <span class='diff-add'> var cell = this;</span> <span class='diff-add'> </span> <span class='diff-add'> this.element.find('.inner_cell').find("a").click(function () {</span> <span class='diff-add'> cell.events.trigger('unrecognized_cell.Cell', {cell: cell});</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatibility.</span> <span class='diff-add'> IPython.Cell = Cell;</span> <span class='diff-add'> return {</span> <span class='diff-add'> Cell: Cell,</span> <span class='diff-add'> UnrecognizedCell: UnrecognizedCell</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/celltoolbar.js b/ipynb/Array-feature-overlap-05_files/celltoolbar.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..23c8d20</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/celltoolbar.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/events'</span> <span class='diff-add'>], function(IPython, $, events) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var CellToolbar = function (options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Constructor</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters:</span> <span class='diff-add'> * options: dictionary</span> <span class='diff-add'> * Dictionary of keyword arguments.</span> <span class='diff-add'> * events: $(Events) instance </span> <span class='diff-add'> * cell: Cell instance</span> <span class='diff-add'> * notebook: Notebook instance </span> <span class='diff-add'> *</span> <span class='diff-add'> * TODO: This leaks, when cell are deleted</span> <span class='diff-add'> * There is still a reference to each celltoolbars.</span> <span class='diff-add'> */</span> <span class='diff-add'> CellToolbar._instances.push(this);</span> <span class='diff-add'> this.notebook = options.notebook;</span> <span class='diff-add'> this.cell = options.cell;</span> <span class='diff-add'> this.create_element();</span> <span class='diff-add'> this.rebuild();</span> <span class='diff-add'> return this;</span> <span class='diff-add'> };</span> <span class='diff-add'> CellToolbar.prototype.create_element = function () {</span> <span class='diff-add'> this.inner_element = $('<div/>').addClass('celltoolbar');</span> <span class='diff-add'> this.element = $('<div/>').addClass('ctb_hideshow')</span> <span class='diff-add'> .append(this.inner_element);</span> <span class='diff-add'> };</span> <span class='diff-add'> // The default css style for the outer celltoolbar div</span> <span class='diff-add'> // (ctb_hideshow) is display: none.</span> <span class='diff-add'> // To show the cell toolbar, *both* of the following conditions must be met:</span> <span class='diff-add'> // - A parent container has class `ctb_global_show`</span> <span class='diff-add'> // - The celltoolbar has the class `ctb_show`</span> <span class='diff-add'> // This allows global show/hide, as well as per-cell show/hide.</span> <span class='diff-add'> CellToolbar.global_hide = function () {</span> <span class='diff-add'> $('body').removeClass('ctb_global_show');</span> <span class='diff-add'> };</span> <span class='diff-add'> CellToolbar.global_show = function () {</span> <span class='diff-add'> $('body').addClass('ctb_global_show');</span> <span class='diff-add'> };</span> <span class='diff-add'> CellToolbar.prototype.hide = function () {</span> <span class='diff-add'> this.element.removeClass('ctb_show');</span> <span class='diff-add'> };</span> <span class='diff-add'> CellToolbar.prototype.show = function () {</span> <span class='diff-add'> this.element.addClass('ctb_show');</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Class variable that should contain a dict of all available callback</span> <span class='diff-add'> * we need to think of wether or not we allow nested namespace</span> <span class='diff-add'> * @property _callback_dict</span> <span class='diff-add'> * @private</span> <span class='diff-add'> * @static</span> <span class='diff-add'> * @type Dict</span> <span class='diff-add'> */</span> <span class='diff-add'> CellToolbar._callback_dict = {};</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Class variable that should contain the reverse order list of the button</span> <span class='diff-add'> * to add to the toolbar of each cell</span> <span class='diff-add'> * @property _ui_controls_list</span> <span class='diff-add'> * @private</span> <span class='diff-add'> * @static</span> <span class='diff-add'> * @type List</span> <span class='diff-add'> */</span> <span class='diff-add'> CellToolbar._ui_controls_list = [];</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Class variable that should contain the CellToolbar instances for each</span> <span class='diff-add'> * cell of the notebook</span> <span class='diff-add'> *</span> <span class='diff-add'> * @private</span> <span class='diff-add'> * @property _instances</span> <span class='diff-add'> * @static</span> <span class='diff-add'> * @type List</span> <span class='diff-add'> */</span> <span class='diff-add'> CellToolbar._instances = [];</span> <span class='diff-add'> /**</span> <span class='diff-add'> * keep a list of all the available presets for the toolbar</span> <span class='diff-add'> * @private</span> <span class='diff-add'> * @property _presets</span> <span class='diff-add'> * @static</span> <span class='diff-add'> * @type Dict</span> <span class='diff-add'> */</span> <span class='diff-add'> CellToolbar._presets = {};</span> <span class='diff-add'> // this is by design not a prototype.</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Register a callback to create an UI element in a cell toolbar.</span> <span class='diff-add'> * @method register_callback</span> <span class='diff-add'> * @param name {String} name to use to refer to the callback. It is advised to use a prefix with the name</span> <span class='diff-add'> * for easier sorting and avoid collision</span> <span class='diff-add'> * @param callback {function(div, cell)} callback that will be called to generate the ui element</span> <span class='diff-add'> * @param [cell_types] {List_of_String|undefined} optional list of cell types. If present the UI element</span> <span class='diff-add'> * will be added only to cells of types in the list.</span> <span class='diff-add'> *</span> <span class='diff-add'> *</span> <span class='diff-add'> * The callback will receive the following element :</span> <span class='diff-add'> *</span> <span class='diff-add'> * * a div in which to add element.</span> <span class='diff-add'> * * the cell it is responsible from</span> <span class='diff-add'> *</span> <span class='diff-add'> * @example</span> <span class='diff-add'> *</span> <span class='diff-add'> * Example that create callback for a button that toggle between `true` and `false` label,</span> <span class='diff-add'> * with the metadata under the key 'foo' to reflect the status of the button.</span> <span class='diff-add'> *</span> <span class='diff-add'> * // first param reference to a DOM div</span> <span class='diff-add'> * // second param reference to the cell.</span> <span class='diff-add'> * var toggle = function(div, cell) {</span> <span class='diff-add'> * var button_container = $(div)</span> <span class='diff-add'> *</span> <span class='diff-add'> * // let's create a button that show the current value of the metadata</span> <span class='diff-add'> * var button = $('<div/>').button({label:String(cell.metadata.foo)});</span> <span class='diff-add'> *</span> <span class='diff-add'> * // On click, change the metadata value and update the button label</span> <span class='diff-add'> * button.click(function(){</span> <span class='diff-add'> * var v = cell.metadata.foo;</span> <span class='diff-add'> * cell.metadata.foo = !v;</span> <span class='diff-add'> * button.button("option", "label", String(!v));</span> <span class='diff-add'> * })</span> <span class='diff-add'> *</span> <span class='diff-add'> * // add the button to the DOM div.</span> <span class='diff-add'> * button_container.append(button);</span> <span class='diff-add'> * }</span> <span class='diff-add'> *</span> <span class='diff-add'> * // now we register the callback under the name `foo` to give the</span> <span class='diff-add'> * // user the ability to use it later</span> <span class='diff-add'> * CellToolbar.register_callback('foo', toggle);</span> <span class='diff-add'> */</span> <span class='diff-add'> CellToolbar.register_callback = function(name, callback, cell_types) {</span> <span class='diff-add'> // Overwrite if it already exists.</span> <span class='diff-add'> CellToolbar._callback_dict[name] = cell_types ? {callback: callback, cell_types: cell_types} : callback;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Register a preset of UI element in a cell toolbar.</span> <span class='diff-add'> * Not supported Yet.</span> <span class='diff-add'> * @method register_preset</span> <span class='diff-add'> * @param name {String} name to use to refer to the preset. It is advised to use a prefix with the name</span> <span class='diff-add'> * for easier sorting and avoid collision</span> <span class='diff-add'> * @param preset_list {List_of_String} reverse order of the button in the toolbar. Each String of the list</span> <span class='diff-add'> * should correspond to a name of a registerd callback.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @private</span> <span class='diff-add'> * @example</span> <span class='diff-add'> *</span> <span class='diff-add'> * CellToolbar.register_callback('foo.c1', function(div, cell){...});</span> <span class='diff-add'> * CellToolbar.register_callback('foo.c2', function(div, cell){...});</span> <span class='diff-add'> * CellToolbar.register_callback('foo.c3', function(div, cell){...});</span> <span class='diff-add'> * CellToolbar.register_callback('foo.c4', function(div, cell){...});</span> <span class='diff-add'> * CellToolbar.register_callback('foo.c5', function(div, cell){...});</span> <span class='diff-add'> *</span> <span class='diff-add'> * CellToolbar.register_preset('foo.foo_preset1', ['foo.c1', 'foo.c2', 'foo.c5'])</span> <span class='diff-add'> * CellToolbar.register_preset('foo.foo_preset2', ['foo.c4', 'foo.c5'])</span> <span class='diff-add'> */</span> <span class='diff-add'> CellToolbar.register_preset = function(name, preset_list, notebook) {</span> <span class='diff-add'> CellToolbar._presets[name] = preset_list;</span> <span class='diff-add'> events.trigger('preset_added.CellToolbar', {name: name});</span> <span class='diff-add'> // When "register_callback" is called by a custom extension, it may be executed after notebook is loaded.</span> <span class='diff-add'> // In that case, activate the preset if needed.</span> <span class='diff-add'> if (notebook && notebook.metadata && notebook.metadata.celltoolbar === name){</span> <span class='diff-add'> CellToolbar.activate_preset(name);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * unregister the selected preset, </span> <span class='diff-add'> *</span> <span class='diff-add'> * return true if preset successfully unregistered</span> <span class='diff-add'> * false otherwise</span> <span class='diff-add'> *</span> <span class='diff-add'> **/</span> <span class='diff-add'> CellToolbar.unregister_preset = function(name){</span> <span class='diff-add'> if(CellToolbar._presets[name]){</span> <span class='diff-add'> delete CellToolbar._presets[name];</span> <span class='diff-add'> events.trigger('unregistered_preset.CellToolbar', {name: name});</span> <span class='diff-add'> return true</span> <span class='diff-add'> }</span> <span class='diff-add'> return false</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * List the names of the presets that are currently registered.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method list_presets</span> <span class='diff-add'> * @static</span> <span class='diff-add'> */</span> <span class='diff-add'> CellToolbar.list_presets = function() {</span> <span class='diff-add'> var keys = [];</span> <span class='diff-add'> for (var k in CellToolbar._presets) {</span> <span class='diff-add'> keys.push(k);</span> <span class='diff-add'> }</span> <span class='diff-add'> return keys;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Activate an UI preset from `register_preset`</span> <span class='diff-add'> *</span> <span class='diff-add'> * This does not update the selection UI.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method activate_preset</span> <span class='diff-add'> * @param preset_name {String} string corresponding to the preset name</span> <span class='diff-add'> *</span> <span class='diff-add'> * @static</span> <span class='diff-add'> * @private</span> <span class='diff-add'> * @example</span> <span class='diff-add'> *</span> <span class='diff-add'> * CellToolbar.activate_preset('foo.foo_preset1');</span> <span class='diff-add'> */</span> <span class='diff-add'> CellToolbar.activate_preset = function(preset_name){</span> <span class='diff-add'> var preset = CellToolbar._presets[preset_name];</span> <span class='diff-add'> if(preset !== undefined){</span> <span class='diff-add'> CellToolbar._ui_controls_list = preset;</span> <span class='diff-add'> CellToolbar.rebuild_all();</span> <span class='diff-add'> }</span> <span class='diff-add'> events.trigger('preset_activated.CellToolbar', {name: preset_name});</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * This should be called on the class and not on a instance as it will trigger</span> <span class='diff-add'> * rebuild of all the instances.</span> <span class='diff-add'> * @method rebuild_all</span> <span class='diff-add'> * @static</span> <span class='diff-add'> *</span> <span class='diff-add'> */</span> <span class='diff-add'> CellToolbar.rebuild_all = function(){</span> <span class='diff-add'> for(var i=0; i < CellToolbar._instances.length; i++){</span> <span class='diff-add'> CellToolbar._instances[i].rebuild();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Rebuild all the button on the toolbar to update its state.</span> <span class='diff-add'> * @method rebuild</span> <span class='diff-add'> */</span> <span class='diff-add'> CellToolbar.prototype.rebuild = function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * strip evrything from the div</span> <span class='diff-add'> * which is probably inner_element</span> <span class='diff-add'> * or this.element.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.inner_element.empty();</span> <span class='diff-add'> this.ui_controls_list = [];</span> <span class='diff-add'> var callbacks = CellToolbar._callback_dict;</span> <span class='diff-add'> var preset = CellToolbar._ui_controls_list;</span> <span class='diff-add'> // Yes we iterate on the class variable, not the instance one.</span> <span class='diff-add'> for (var i=0; i < preset.length; i++) {</span> <span class='diff-add'> var key = preset[i];</span> <span class='diff-add'> var callback = callbacks[key];</span> <span class='diff-add'> if (!callback) continue;</span> <span class='diff-add'> if (typeof callback === 'object') {</span> <span class='diff-add'> if (callback.cell_types.indexOf(this.cell.cell_type) === -1) continue;</span> <span class='diff-add'> callback = callback.callback;</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> var local_div = $('<div/>').addClass('button_container');</span> <span class='diff-add'> try {</span> <span class='diff-add'> callback(local_div, this.cell, this);</span> <span class='diff-add'> this.ui_controls_list.push(key);</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> console.log("Error in cell toolbar callback " + key, e);</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // only append if callback succeeded.</span> <span class='diff-add'> this.inner_element.append(local_div);</span> <span class='diff-add'> }</span> <span class='diff-add'> // If there are no controls or the cell is a rendered TextCell hide the toolbar.</span> <span class='diff-add'> if (!this.ui_controls_list.length) {</span> <span class='diff-add'> this.hide();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.show();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> CellToolbar.utils = {};</span> <span class='diff-add'> /**</span> <span class='diff-add'> * A utility function to generate bindings between a checkbox and cell/metadata</span> <span class='diff-add'> * @method utils.checkbox_ui_generator</span> <span class='diff-add'> * @static</span> <span class='diff-add'> *</span> <span class='diff-add'> * @param name {string} Label in front of the checkbox</span> <span class='diff-add'> * @param setter {function( cell, newValue )}</span> <span class='diff-add'> * A setter method to set the newValue</span> <span class='diff-add'> * @param getter {function( cell )}</span> <span class='diff-add'> * A getter methods which return the current value.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @return callback {function( div, cell )} Callback to be passed to `register_callback`</span> <span class='diff-add'> *</span> <span class='diff-add'> * @example</span> <span class='diff-add'> *</span> <span class='diff-add'> * An exmple that bind the subkey `slideshow.isSectionStart` to a checkbox with a `New Slide` label</span> <span class='diff-add'> *</span> <span class='diff-add'> * var newSlide = CellToolbar.utils.checkbox_ui_generator('New Slide',</span> <span class='diff-add'> * // setter</span> <span class='diff-add'> * function(cell, value){</span> <span class='diff-add'> * // we check that the slideshow namespace exist and create it if needed</span> <span class='diff-add'> * if (cell.metadata.slideshow == undefined){cell.metadata.slideshow = {}}</span> <span class='diff-add'> * // set the value</span> <span class='diff-add'> * cell.metadata.slideshow.isSectionStart = value</span> <span class='diff-add'> * },</span> <span class='diff-add'> * //geter</span> <span class='diff-add'> * function(cell){ var ns = cell.metadata.slideshow;</span> <span class='diff-add'> * // if the slideshow namespace does not exist return `undefined`</span> <span class='diff-add'> * // (will be interpreted as `false` by checkbox) otherwise</span> <span class='diff-add'> * // return the value</span> <span class='diff-add'> * return (ns == undefined)? undefined: ns.isSectionStart</span> <span class='diff-add'> * }</span> <span class='diff-add'> * );</span> <span class='diff-add'> *</span> <span class='diff-add'> * CellToolbar.register_callback('newSlide', newSlide);</span> <span class='diff-add'> *</span> <span class='diff-add'> */</span> <span class='diff-add'> CellToolbar.utils.checkbox_ui_generator = function(name, setter, getter){</span> <span class='diff-add'> return function(div, cell, celltoolbar) {</span> <span class='diff-add'> var button_container = $(div);</span> <span class='diff-add'> var chkb = $('<input/>').attr('type', 'checkbox');</span> <span class='diff-add'> var lbl = $('<label/>').append($('<span/>').text(name));</span> <span class='diff-add'> lbl.append(chkb);</span> <span class='diff-add'> chkb.attr("checked", getter(cell));</span> <span class='diff-add'> chkb.click(function(){</span> <span class='diff-add'> var v = getter(cell);</span> <span class='diff-add'> setter(cell, !v);</span> <span class='diff-add'> chkb.attr("checked", !v);</span> <span class='diff-add'> });</span> <span class='diff-add'> button_container.append($('<span/>').append(lbl));</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * A utility function to generate bindings between a input field and cell/metadata</span> <span class='diff-add'> * @method utils.input_ui_generator</span> <span class='diff-add'> * @static</span> <span class='diff-add'> *</span> <span class='diff-add'> * @param name {string} Label in front of the input field</span> <span class='diff-add'> * @param setter {function( cell, newValue )}</span> <span class='diff-add'> * A setter method to set the newValue</span> <span class='diff-add'> * @param getter {function( cell )}</span> <span class='diff-add'> * A getter methods which return the current value.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @return callback {function( div, cell )} Callback to be passed to `register_callback`</span> <span class='diff-add'> *</span> <span class='diff-add'> */</span> <span class='diff-add'> CellToolbar.utils.input_ui_generator = function(name, setter, getter){</span> <span class='diff-add'> return function(div, cell, celltoolbar) {</span> <span class='diff-add'> var button_container = $(div);</span> <span class='diff-add'> var text = $('<input/>').attr('type', 'text');</span> <span class='diff-add'> var lbl = $('<label/>').append($('<span/>').text(name));</span> <span class='diff-add'> lbl.append(text);</span> <span class='diff-add'> text.attr("value", getter(cell));</span> <span class='diff-add'> text.keyup(function(){</span> <span class='diff-add'> setter(cell, text.val());</span> <span class='diff-add'> });</span> <span class='diff-add'> button_container.append($('<span/>').append(lbl));</span> <span class='diff-add'> IPython.keyboard_manager.register_events(text);</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * A utility function to generate bindings between a dropdown list cell</span> <span class='diff-add'> * @method utils.select_ui_generator</span> <span class='diff-add'> * @static</span> <span class='diff-add'> *</span> <span class='diff-add'> * @param list_list {list_of_sublist} List of sublist of metadata value and name in the dropdown list.</span> <span class='diff-add'> * subslit shoud contain 2 element each, first a string that woul be displayed in the dropdown list,</span> <span class='diff-add'> * and second the corresponding value to be passed to setter/return by getter. the corresponding value </span> <span class='diff-add'> * should not be "undefined" or behavior can be unexpected.</span> <span class='diff-add'> * @param setter {function( cell, newValue )}</span> <span class='diff-add'> * A setter method to set the newValue</span> <span class='diff-add'> * @param getter {function( cell )}</span> <span class='diff-add'> * A getter methods which return the current value of the metadata.</span> <span class='diff-add'> * @param [label=""] {String} optionnal label for the dropdown menu</span> <span class='diff-add'> *</span> <span class='diff-add'> * @return callback {function( div, cell )} Callback to be passed to `register_callback`</span> <span class='diff-add'> *</span> <span class='diff-add'> * @example</span> <span class='diff-add'> *</span> <span class='diff-add'> * var select_type = CellToolbar.utils.select_ui_generator([</span> <span class='diff-add'> * ["<None>" , "None" ],</span> <span class='diff-add'> * ["Header Slide" , "header_slide" ],</span> <span class='diff-add'> * ["Slide" , "slide" ],</span> <span class='diff-add'> * ["Fragment" , "fragment" ],</span> <span class='diff-add'> * ["Skip" , "skip" ],</span> <span class='diff-add'> * ],</span> <span class='diff-add'> * // setter</span> <span class='diff-add'> * function(cell, value){</span> <span class='diff-add'> * // we check that the slideshow namespace exist and create it if needed</span> <span class='diff-add'> * if (cell.metadata.slideshow == undefined){cell.metadata.slideshow = {}}</span> <span class='diff-add'> * // set the value</span> <span class='diff-add'> * cell.metadata.slideshow.slide_type = value</span> <span class='diff-add'> * },</span> <span class='diff-add'> * //geter</span> <span class='diff-add'> * function(cell){ var ns = cell.metadata.slideshow;</span> <span class='diff-add'> * // if the slideshow namespace does not exist return `undefined`</span> <span class='diff-add'> * // (will be interpreted as `false` by checkbox) otherwise</span> <span class='diff-add'> * // return the value</span> <span class='diff-add'> * return (ns == undefined)? undefined: ns.slide_type</span> <span class='diff-add'> * }</span> <span class='diff-add'> * CellToolbar.register_callback('slideshow.select', select_type);</span> <span class='diff-add'> *</span> <span class='diff-add'> */</span> <span class='diff-add'> CellToolbar.utils.select_ui_generator = function(list_list, setter, getter, label) {</span> <span class='diff-add'> label = label || "";</span> <span class='diff-add'> return function(div, cell, celltoolbar) {</span> <span class='diff-add'> var button_container = $(div);</span> <span class='diff-add'> var lbl = $("<label/>").append($('<span/>').text(label));</span> <span class='diff-add'> var select = $('<select/>');</span> <span class='diff-add'> for(var i=0; i < list_list.length; i++){</span> <span class='diff-add'> var opt = $('<option/>')</span> <span class='diff-add'> .attr('value', list_list[i][1])</span> <span class='diff-add'> .text(list_list[i][0]);</span> <span class='diff-add'> select.append(opt);</span> <span class='diff-add'> }</span> <span class='diff-add'> select.val(getter(cell));</span> <span class='diff-add'> select.change(function(){</span> <span class='diff-add'> setter(cell, select.val());</span> <span class='diff-add'> });</span> <span class='diff-add'> button_container.append($('<span/>').append(lbl).append(select));</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatability.</span> <span class='diff-add'> IPython.CellToolbar = CellToolbar;</span> <span class='diff-add'> return {'CellToolbar': CellToolbar};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/closebrackets.js b/ipynb/Array-feature-overlap-05_files/closebrackets.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..f6b42f0</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/closebrackets.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span> <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span> <span class='diff-add'>(function(mod) {</span> <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span> <span class='diff-add'> mod(require("../../lib/codemirror"));</span> <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span> <span class='diff-add'> define(["../../lib/codemirror"], mod);</span> <span class='diff-add'> else // Plain browser env</span> <span class='diff-add'> mod(CodeMirror);</span> <span class='diff-add'>})(function(CodeMirror) {</span> <span class='diff-add'> var DEFAULT_BRACKETS = "()[]{}''\"\"";</span> <span class='diff-add'> var DEFAULT_EXPLODE_ON_ENTER = "[]{}";</span> <span class='diff-add'> var SPACE_CHAR_REGEX = /\s/;</span> <span class='diff-add'> var Pos = CodeMirror.Pos;</span> <span class='diff-add'> CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) {</span> <span class='diff-add'> if (old != CodeMirror.Init && old)</span> <span class='diff-add'> cm.removeKeyMap("autoCloseBrackets");</span> <span class='diff-add'> if (!val) return;</span> <span class='diff-add'> var pairs = DEFAULT_BRACKETS, explode = DEFAULT_EXPLODE_ON_ENTER;</span> <span class='diff-add'> if (typeof val == "string") pairs = val;</span> <span class='diff-add'> else if (typeof val == "object") {</span> <span class='diff-add'> if (val.pairs != null) pairs = val.pairs;</span> <span class='diff-add'> if (val.explode != null) explode = val.explode;</span> <span class='diff-add'> }</span> <span class='diff-add'> var map = buildKeymap(pairs);</span> <span class='diff-add'> if (explode) map.Enter = buildExplodeHandler(explode);</span> <span class='diff-add'> cm.addKeyMap(map);</span> <span class='diff-add'> });</span> <span class='diff-add'> function charsAround(cm, pos) {</span> <span class='diff-add'> var str = cm.getRange(Pos(pos.line, pos.ch - 1),</span> <span class='diff-add'> Pos(pos.line, pos.ch + 1));</span> <span class='diff-add'> return str.length == 2 ? str : null;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Project the token type that will exists after the given char is</span> <span class='diff-add'> // typed, and use it to determine whether it would cause the start</span> <span class='diff-add'> // of a string token.</span> <span class='diff-add'> function enteringString(cm, pos, ch) {</span> <span class='diff-add'> var line = cm.getLine(pos.line);</span> <span class='diff-add'> var token = cm.getTokenAt(pos);</span> <span class='diff-add'> if (/\bstring2?\b/.test(token.type)) return false;</span> <span class='diff-add'> var stream = new CodeMirror.StringStream(line.slice(0, pos.ch) + ch + line.slice(pos.ch), 4);</span> <span class='diff-add'> stream.pos = stream.start = token.start;</span> <span class='diff-add'> for (;;) {</span> <span class='diff-add'> var type1 = cm.getMode().token(stream, token.state);</span> <span class='diff-add'> if (stream.pos >= pos.ch + 1) return /\bstring2?\b/.test(type1);</span> <span class='diff-add'> stream.start = stream.pos;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function buildKeymap(pairs) {</span> <span class='diff-add'> var map = {</span> <span class='diff-add'> name : "autoCloseBrackets",</span> <span class='diff-add'> Backspace: function(cm) {</span> <span class='diff-add'> if (cm.getOption("disableInput")) return CodeMirror.Pass;</span> <span class='diff-add'> var ranges = cm.listSelections();</span> <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span> <span class='diff-add'> if (!ranges[i].empty()) return CodeMirror.Pass;</span> <span class='diff-add'> var around = charsAround(cm, ranges[i].head);</span> <span class='diff-add'> if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;</span> <span class='diff-add'> }</span> <span class='diff-add'> for (var i = ranges.length - 1; i >= 0; i--) {</span> <span class='diff-add'> var cur = ranges[i].head;</span> <span class='diff-add'> cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var closingBrackets = "";</span> <span class='diff-add'> for (var i = 0; i < pairs.length; i += 2) (function(left, right) {</span> <span class='diff-add'> closingBrackets += right;</span> <span class='diff-add'> map["'" + left + "'"] = function(cm) {</span> <span class='diff-add'> if (cm.getOption("disableInput")) return CodeMirror.Pass;</span> <span class='diff-add'> var ranges = cm.listSelections(), type, next;</span> <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span> <span class='diff-add'> var range = ranges[i], cur = range.head, curType;</span> <span class='diff-add'> var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));</span> <span class='diff-add'> if (!range.empty()) {</span> <span class='diff-add'> curType = "surround";</span> <span class='diff-add'> } else if (left == right && next == right) {</span> <span class='diff-add'> if (cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == left + left + left)</span> <span class='diff-add'> curType = "skipThree";</span> <span class='diff-add'> else</span> <span class='diff-add'> curType = "skip";</span> <span class='diff-add'> } else if (left == right && cur.ch > 1 &&</span> <span class='diff-add'> cm.getRange(Pos(cur.line, cur.ch - 2), cur) == left + left &&</span> <span class='diff-add'> (cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != left)) {</span> <span class='diff-add'> curType = "addFour";</span> <span class='diff-add'> } else if (left == '"' || left == "'") {</span> <span class='diff-add'> if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, left)) curType = "both";</span> <span class='diff-add'> else return CodeMirror.Pass;</span> <span class='diff-add'> } else if (cm.getLine(cur.line).length == cur.ch || closingBrackets.indexOf(next) >= 0 || SPACE_CHAR_REGEX.test(next)) {</span> <span class='diff-add'> curType = "both";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return CodeMirror.Pass;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!type) type = curType;</span> <span class='diff-add'> else if (type != curType) return CodeMirror.Pass;</span> <span class='diff-add'> }</span> <span class='diff-add'> cm.operation(function() {</span> <span class='diff-add'> if (type == "skip") {</span> <span class='diff-add'> cm.execCommand("goCharRight");</span> <span class='diff-add'> } else if (type == "skipThree") {</span> <span class='diff-add'> for (var i = 0; i < 3; i++)</span> <span class='diff-add'> cm.execCommand("goCharRight");</span> <span class='diff-add'> } else if (type == "surround") {</span> <span class='diff-add'> var sels = cm.getSelections();</span> <span class='diff-add'> for (var i = 0; i < sels.length; i++)</span> <span class='diff-add'> sels[i] = left + sels[i] + right;</span> <span class='diff-add'> cm.replaceSelections(sels, "around");</span> <span class='diff-add'> } else if (type == "both") {</span> <span class='diff-add'> cm.replaceSelection(left + right, null);</span> <span class='diff-add'> cm.execCommand("goCharLeft");</span> <span class='diff-add'> } else if (type == "addFour") {</span> <span class='diff-add'> cm.replaceSelection(left + left + left + left, "before");</span> <span class='diff-add'> cm.execCommand("goCharRight");</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> if (left != right) map["'" + right + "'"] = function(cm) {</span> <span class='diff-add'> var ranges = cm.listSelections();</span> <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span> <span class='diff-add'> var range = ranges[i];</span> <span class='diff-add'> if (!range.empty() ||</span> <span class='diff-add'> cm.getRange(range.head, Pos(range.head.line, range.head.ch + 1)) != right)</span> <span class='diff-add'> return CodeMirror.Pass;</span> <span class='diff-add'> }</span> <span class='diff-add'> cm.execCommand("goCharRight");</span> <span class='diff-add'> };</span> <span class='diff-add'> })(pairs.charAt(i), pairs.charAt(i + 1));</span> <span class='diff-add'> return map;</span> <span class='diff-add'> }</span> <span class='diff-add'> function buildExplodeHandler(pairs) {</span> <span class='diff-add'> return function(cm) {</span> <span class='diff-add'> if (cm.getOption("disableInput")) return CodeMirror.Pass;</span> <span class='diff-add'> var ranges = cm.listSelections();</span> <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span> <span class='diff-add'> if (!ranges[i].empty()) return CodeMirror.Pass;</span> <span class='diff-add'> var around = charsAround(cm, ranges[i].head);</span> <span class='diff-add'> if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;</span> <span class='diff-add'> }</span> <span class='diff-add'> cm.operation(function() {</span> <span class='diff-add'> cm.replaceSelection("\n\n", null);</span> <span class='diff-add'> cm.execCommand("goCharLeft");</span> <span class='diff-add'> ranges = cm.listSelections();</span> <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span> <span class='diff-add'> var line = ranges[i].head.line;</span> <span class='diff-add'> cm.indentLine(line, null, true);</span> <span class='diff-add'> cm.indentLine(line + 1, null, true);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/codecell.js b/ipynb/Array-feature-overlap-05_files/codecell.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..ebc0b62</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/codecell.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>/**</span> <span class='diff-add'> *</span> <span class='diff-add'> *</span> <span class='diff-add'> * @module codecell</span> <span class='diff-add'> * @namespace codecell</span> <span class='diff-add'> * @class CodeCell</span> <span class='diff-add'> */</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> 'base/js/keyboard',</span> <span class='diff-add'> 'services/config',</span> <span class='diff-add'> 'notebook/js/cell',</span> <span class='diff-add'> 'notebook/js/outputarea',</span> <span class='diff-add'> 'notebook/js/completer',</span> <span class='diff-add'> 'notebook/js/celltoolbar',</span> <span class='diff-add'> 'codemirror/lib/codemirror',</span> <span class='diff-add'> 'codemirror/mode/python/python',</span> <span class='diff-add'> 'notebook/js/codemirror-ipython'</span> <span class='diff-add'>], function(IPython,</span> <span class='diff-add'> $,</span> <span class='diff-add'> utils,</span> <span class='diff-add'> keyboard,</span> <span class='diff-add'> configmod,</span> <span class='diff-add'> cell,</span> <span class='diff-add'> outputarea,</span> <span class='diff-add'> completer,</span> <span class='diff-add'> celltoolbar,</span> <span class='diff-add'> CodeMirror,</span> <span class='diff-add'> cmpython,</span> <span class='diff-add'> cmip</span> <span class='diff-add'> ) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> </span> <span class='diff-add'> var Cell = cell.Cell;</span> <span class='diff-add'> /* local util for codemirror */</span> <span class='diff-add'> var posEq = function(a, b) {return a.line === b.line && a.ch === b.ch;};</span> <span class='diff-add'> /**</span> <span class='diff-add'> *</span> <span class='diff-add'> * function to delete until previous non blanking space character</span> <span class='diff-add'> * or first multiple of 4 tabstop.</span> <span class='diff-add'> * @private</span> <span class='diff-add'> */</span> <span class='diff-add'> CodeMirror.commands.delSpaceToPrevTabStop = function(cm){</span> <span class='diff-add'> var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to);</span> <span class='diff-add'> if (!posEq(from, to)) { cm.replaceRange("", from, to); return; }</span> <span class='diff-add'> var cur = cm.getCursor(), line = cm.getLine(cur.line);</span> <span class='diff-add'> var tabsize = cm.getOption('tabSize');</span> <span class='diff-add'> var chToPrevTabStop = cur.ch-(Math.ceil(cur.ch/tabsize)-1)*tabsize;</span> <span class='diff-add'> from = {ch:cur.ch-chToPrevTabStop,line:cur.line};</span> <span class='diff-add'> var select = cm.getRange(from,cur);</span> <span class='diff-add'> if( select.match(/^\ +$/) !== null){</span> <span class='diff-add'> cm.replaceRange("",from,cur);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> cm.deleteH(-1,"char");</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var keycodes = keyboard.keycodes;</span> <span class='diff-add'> var CodeCell = function (kernel, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Constructor</span> <span class='diff-add'> *</span> <span class='diff-add'> * A Cell conceived to write code.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters:</span> <span class='diff-add'> * kernel: Kernel instance</span> <span class='diff-add'> * The kernel doesn't have to be set at creation time, in that case</span> <span class='diff-add'> * it will be null and set_kernel has to be called later.</span> <span class='diff-add'> * options: dictionary</span> <span class='diff-add'> * Dictionary of keyword arguments.</span> <span class='diff-add'> * events: $(Events) instance </span> <span class='diff-add'> * config: dictionary</span> <span class='diff-add'> * keyboard_manager: KeyboardManager instance </span> <span class='diff-add'> * notebook: Notebook instance</span> <span class='diff-add'> * tooltip: Tooltip instance</span> <span class='diff-add'> */</span> <span class='diff-add'> this.kernel = kernel || null;</span> <span class='diff-add'> this.notebook = options.notebook;</span> <span class='diff-add'> this.collapsed = false;</span> <span class='diff-add'> this.events = options.events;</span> <span class='diff-add'> this.tooltip = options.tooltip;</span> <span class='diff-add'> this.config = options.config;</span> <span class='diff-add'> this.class_config = new configmod.ConfigWithDefaults(this.config,</span> <span class='diff-add'> CodeCell.config_defaults, 'CodeCell');</span> <span class='diff-add'> // create all attributed in constructor function</span> <span class='diff-add'> // even if null for V8 VM optimisation</span> <span class='diff-add'> this.input_prompt_number = null;</span> <span class='diff-add'> this.celltoolbar = null;</span> <span class='diff-add'> this.output_area = null;</span> <span class='diff-add'> this.last_msg_id = null;</span> <span class='diff-add'> this.completer = null;</span> <span class='diff-add'> this.widget_views = [];</span> <span class='diff-add'> this._widgets_live = true;</span> <span class='diff-add'> Cell.apply(this,[{</span> <span class='diff-add'> config: $.extend({}, CodeCell.options_default), </span> <span class='diff-add'> keyboard_manager: options.keyboard_manager, </span> <span class='diff-add'> events: this.events}]);</span> <span class='diff-add'> // Attributes we want to override in this subclass.</span> <span class='diff-add'> this.cell_type = "code";</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.element.focusout(</span> <span class='diff-add'> function() { that.auto_highlight(); }</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.options_default = {</span> <span class='diff-add'> cm_config : {</span> <span class='diff-add'> extraKeys: {</span> <span class='diff-add'> "Tab" : "indentMore",</span> <span class='diff-add'> "Shift-Tab" : "indentLess",</span> <span class='diff-add'> "Backspace" : "delSpaceToPrevTabStop",</span> <span class='diff-add'> "Cmd-/" : "toggleComment",</span> <span class='diff-add'> "Ctrl-/" : "toggleComment"</span> <span class='diff-add'> },</span> <span class='diff-add'> mode: 'ipython',</span> <span class='diff-add'> theme: 'ipython',</span> <span class='diff-add'> matchBrackets: true</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.config_defaults = {</span> <span class='diff-add'> highlight_modes : {</span> <span class='diff-add'> 'magic_javascript' :{'reg':[/^%%javascript/]},</span> <span class='diff-add'> 'magic_perl' :{'reg':[/^%%perl/]},</span> <span class='diff-add'> 'magic_ruby' :{'reg':[/^%%ruby/]},</span> <span class='diff-add'> 'magic_python' :{'reg':[/^%%python3?/]},</span> <span class='diff-add'> 'magic_shell' :{'reg':[/^%%bash/]},</span> <span class='diff-add'> 'magic_r' :{'reg':[/^%%R/]},</span> <span class='diff-add'> 'magic_text/x-cython' :{'reg':[/^%%cython/]},</span> <span class='diff-add'> },</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.msg_cells = {};</span> <span class='diff-add'> CodeCell.prototype = Object.create(Cell.prototype);</span> <span class='diff-add'> /** @method create_element */</span> <span class='diff-add'> CodeCell.prototype.create_element = function () {</span> <span class='diff-add'> Cell.prototype.create_element.apply(this, arguments);</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var cell = $('<div></div>').addClass('cell code_cell');</span> <span class='diff-add'> cell.attr('tabindex','2');</span> <span class='diff-add'> var input = $('<div></div>').addClass('input');</span> <span class='diff-add'> var prompt = $('<div/>').addClass('prompt input_prompt');</span> <span class='diff-add'> var inner_cell = $('<div/>').addClass('inner_cell');</span> <span class='diff-add'> this.celltoolbar = new celltoolbar.CellToolbar({</span> <span class='diff-add'> cell: this, </span> <span class='diff-add'> notebook: this.notebook});</span> <span class='diff-add'> inner_cell.append(this.celltoolbar.element);</span> <span class='diff-add'> var input_area = $('<div/>').addClass('input_area');</span> <span class='diff-add'> this.code_mirror = new CodeMirror(input_area.get(0), this.cm_config);</span> <span class='diff-add'> // In case of bugs that put the keyboard manager into an inconsistent state,</span> <span class='diff-add'> // ensure KM is enabled when CodeMirror is focused:</span> <span class='diff-add'> this.code_mirror.on('focus', function () {</span> <span class='diff-add'> if (that.keyboard_manager) {</span> <span class='diff-add'> that.keyboard_manager.enable();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> this.code_mirror.on('keydown', $.proxy(this.handle_keyevent,this));</span> <span class='diff-add'> $(this.code_mirror.getInputField()).attr("spellcheck", "false");</span> <span class='diff-add'> inner_cell.append(input_area);</span> <span class='diff-add'> input.append(prompt).append(inner_cell);</span> <span class='diff-add'> var widget_area = $('<div/>')</span> <span class='diff-add'> .addClass('widget-area')</span> <span class='diff-add'> .hide();</span> <span class='diff-add'> this.widget_area = widget_area;</span> <span class='diff-add'> var widget_prompt = $('<div/>')</span> <span class='diff-add'> .addClass('prompt')</span> <span class='diff-add'> .appendTo(widget_area);</span> <span class='diff-add'> var widget_subarea = $('<div/>')</span> <span class='diff-add'> .addClass('widget-subarea')</span> <span class='diff-add'> .appendTo(widget_area);</span> <span class='diff-add'> this.widget_subarea = widget_subarea;</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var widget_clear_buton = $('<button />')</span> <span class='diff-add'> .addClass('close')</span> <span class='diff-add'> .html('×')</span> <span class='diff-add'> .click(function() {</span> <span class='diff-add'> widget_area.slideUp('', function(){ </span> <span class='diff-add'> for (var i = 0; i < that.widget_views.length; i++) {</span> <span class='diff-add'> var view = that.widget_views[i];</span> <span class='diff-add'> view.remove();</span> <span class='diff-add'> // Remove widget live events.</span> <span class='diff-add'> view.off('comm:live', that._widget_live);</span> <span class='diff-add'> view.off('comm:dead', that._widget_dead);</span> <span class='diff-add'> }</span> <span class='diff-add'> that.widget_views = [];</span> <span class='diff-add'> widget_subarea.html(''); </span> <span class='diff-add'> });</span> <span class='diff-add'> })</span> <span class='diff-add'> .appendTo(widget_prompt);</span> <span class='diff-add'> var output = $('<div></div>');</span> <span class='diff-add'> cell.append(input).append(widget_area).append(output);</span> <span class='diff-add'> this.element = cell;</span> <span class='diff-add'> this.output_area = new outputarea.OutputArea({</span> <span class='diff-add'> selector: output, </span> <span class='diff-add'> prompt_area: true, </span> <span class='diff-add'> events: this.events, </span> <span class='diff-add'> keyboard_manager: this.keyboard_manager});</span> <span class='diff-add'> this.completer = new completer.Completer(this, this.events);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Display a widget view in the cell.</span> <span class='diff-add'> */</span> <span class='diff-add'> CodeCell.prototype.display_widget_view = function(view_promise) {</span> <span class='diff-add'> // Display a dummy element</span> <span class='diff-add'> var dummy = $('<div/>');</span> <span class='diff-add'> this.widget_subarea.append(dummy);</span> <span class='diff-add'> // Display the view.</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> return view_promise.then(function(view) {</span> <span class='diff-add'> that.widget_area.show();</span> <span class='diff-add'> dummy.replaceWith(view.$el);</span> <span class='diff-add'> that.widget_views.push(view);</span> <span class='diff-add'> // Check the live state of the view's model.</span> <span class='diff-add'> if (view.model.comm_live) {</span> <span class='diff-add'> that._widget_live(view);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> that._widget_dead(view);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Listen to comm live events for the view.</span> <span class='diff-add'> view.on('comm:live', that._widget_live, that);</span> <span class='diff-add'> view.on('comm:dead', that._widget_dead, that);</span> <span class='diff-add'> return view;</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handles when a widget loses it's comm connection.</span> <span class='diff-add'> * @param {WidgetView} view</span> <span class='diff-add'> */</span> <span class='diff-add'> CodeCell.prototype._widget_dead = function(view) {</span> <span class='diff-add'> if (this._widgets_live) {</span> <span class='diff-add'> this._widgets_live = false;</span> <span class='diff-add'> this.widget_area.addClass('connection-problems');</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handles when a widget is connected to a live comm.</span> <span class='diff-add'> * @param {WidgetView} view</span> <span class='diff-add'> */</span> <span class='diff-add'> CodeCell.prototype._widget_live = function(view) {</span> <span class='diff-add'> if (!this._widgets_live) {</span> <span class='diff-add'> // Check that the other widgets are live too. O(N) operation.</span> <span class='diff-add'> // Abort the function at the first dead widget found.</span> <span class='diff-add'> for (var i = 0; i < this.widget_views.length; i++) {</span> <span class='diff-add'> if (!this.widget_views[i].model.comm_live) return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this._widgets_live = true;</span> <span class='diff-add'> this.widget_area.removeClass('connection-problems');</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @method bind_events */</span> <span class='diff-add'> CodeCell.prototype.bind_events = function () {</span> <span class='diff-add'> Cell.prototype.bind_events.apply(this);</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.element.focusout(</span> <span class='diff-add'> function() { that.auto_highlight(); }</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * This method gets called in CodeMirror's onKeyDown/onKeyPress</span> <span class='diff-add'> * handlers and is used to provide custom key handling. Its return</span> <span class='diff-add'> * value is used to determine if CodeMirror should ignore the event:</span> <span class='diff-add'> * true = ignore, false = don't ignore.</span> <span class='diff-add'> * @method handle_codemirror_keyevent</span> <span class='diff-add'> */</span> <span class='diff-add'> CodeCell.prototype.handle_codemirror_keyevent = function (editor, event) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> // whatever key is pressed, first, cancel the tooltip request before</span> <span class='diff-add'> // they are sent, and remove tooltip if any, except for tab again</span> <span class='diff-add'> var tooltip_closed = null;</span> <span class='diff-add'> if (event.type === 'keydown' && event.which !== keycodes.tab ) {</span> <span class='diff-add'> tooltip_closed = this.tooltip.remove_and_cancel_tooltip();</span> <span class='diff-add'> }</span> <span class='diff-add'> var cur = editor.getCursor();</span> <span class='diff-add'> if (event.keyCode === keycodes.enter){</span> <span class='diff-add'> this.auto_highlight();</span> <span class='diff-add'> }</span> <span class='diff-add'> if (event.which === keycodes.down && event.type === 'keypress' && this.tooltip.time_before_tooltip >= 0) {</span> <span class='diff-add'> // triger on keypress (!) otherwise inconsistent event.which depending on plateform</span> <span class='diff-add'> // browser and keyboard layout !</span> <span class='diff-add'> // Pressing '(' , request tooltip, don't forget to reappend it</span> <span class='diff-add'> // The second argument says to hide the tooltip if the docstring</span> <span class='diff-add'> // is actually empty</span> <span class='diff-add'> this.tooltip.pending(that, true);</span> <span class='diff-add'> } else if ( tooltip_closed && event.which === keycodes.esc && event.type === 'keydown') {</span> <span class='diff-add'> // If tooltip is active, cancel it. The call to</span> <span class='diff-add'> // remove_and_cancel_tooltip above doesn't pass, force=true.</span> <span class='diff-add'> // Because of this it won't actually close the tooltip</span> <span class='diff-add'> // if it is in sticky mode. Thus, we have to check again if it is open</span> <span class='diff-add'> // and close it with force=true.</span> <span class='diff-add'> if (!this.tooltip._hidden) {</span> <span class='diff-add'> this.tooltip.remove_and_cancel_tooltip(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> // If we closed the tooltip, don't let CM or the global handlers</span> <span class='diff-add'> // handle this event.</span> <span class='diff-add'> event.codemirrorIgnore = true;</span> <span class='diff-add'> event._ipkmIgnore = true;</span> <span class='diff-add'> event.preventDefault();</span> <span class='diff-add'> return true;</span> <span class='diff-add'> } else if (event.keyCode === keycodes.tab && event.type === 'keydown' && event.shiftKey) {</span> <span class='diff-add'> if (editor.somethingSelected() || editor.getSelections().length !== 1){</span> <span class='diff-add'> var anchor = editor.getCursor("anchor");</span> <span class='diff-add'> var head = editor.getCursor("head");</span> <span class='diff-add'> if( anchor.line !== head.line){</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> var pre_cursor = editor.getRange({line:cur.line,ch:0},cur);</span> <span class='diff-add'> if (pre_cursor.trim() === "") {</span> <span class='diff-add'> // Don't show tooltip if the part of the line before the cursor</span> <span class='diff-add'> // is empty. In this case, let CodeMirror handle indentation.</span> <span class='diff-add'> return false;</span> <span class='diff-add'> } </span> <span class='diff-add'> this.tooltip.request(that);</span> <span class='diff-add'> event.codemirrorIgnore = true;</span> <span class='diff-add'> event.preventDefault();</span> <span class='diff-add'> return true;</span> <span class='diff-add'> } else if (event.keyCode === keycodes.tab && event.type === 'keydown') {</span> <span class='diff-add'> // Tab completion.</span> <span class='diff-add'> this.tooltip.remove_and_cancel_tooltip();</span> <span class='diff-add'> // completion does not work on multicursor, it might be possible though in some cases</span> <span class='diff-add'> if (editor.somethingSelected() || editor.getSelections().length > 1) {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> var pre_cursor = editor.getRange({line:cur.line,ch:0},cur);</span> <span class='diff-add'> if (pre_cursor.trim() === "") {</span> <span class='diff-add'> // Don't autocomplete if the part of the line before the cursor</span> <span class='diff-add'> // is empty. In this case, let CodeMirror handle indentation.</span> <span class='diff-add'> return false;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> event.codemirrorIgnore = true;</span> <span class='diff-add'> event.preventDefault();</span> <span class='diff-add'> this.completer.startCompletion();</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> } </span> <span class='diff-add'> </span> <span class='diff-add'> // keyboard event wasn't one of those unique to code cells, let's see</span> <span class='diff-add'> // if it's one of the generic ones (i.e. check edit mode shortcuts)</span> <span class='diff-add'> return Cell.prototype.handle_codemirror_keyevent.apply(this, [editor, event]);</span> <span class='diff-add'> };</span> <span class='diff-add'> // Kernel related calls.</span> <span class='diff-add'> CodeCell.prototype.set_kernel = function (kernel) {</span> <span class='diff-add'> this.kernel = kernel;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Execute current code cell to the kernel</span> <span class='diff-add'> * @method execute</span> <span class='diff-add'> */</span> <span class='diff-add'> CodeCell.prototype.execute = function (stop_on_error) {</span> <span class='diff-add'> if (!this.kernel || !this.kernel.is_connected()) {</span> <span class='diff-add'> console.log("Can't execute, kernel is not connected.");</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.output_area.clear_output(false, true);</span> <span class='diff-add'> if (stop_on_error === undefined) {</span> <span class='diff-add'> stop_on_error = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Clear widget area</span> <span class='diff-add'> for (var i = 0; i < this.widget_views.length; i++) {</span> <span class='diff-add'> var view = this.widget_views[i];</span> <span class='diff-add'> view.remove();</span> <span class='diff-add'> // Remove widget live events.</span> <span class='diff-add'> view.off('comm:live', this._widget_live);</span> <span class='diff-add'> view.off('comm:dead', this._widget_dead);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.widget_views = [];</span> <span class='diff-add'> this.widget_subarea.html('');</span> <span class='diff-add'> this.widget_subarea.height('');</span> <span class='diff-add'> this.widget_area.height('');</span> <span class='diff-add'> this.widget_area.hide();</span> <span class='diff-add'> </span> <span class='diff-add'> var old_msg_id = this.last_msg_id;</span> <span class='diff-add'> if (old_msg_id) {</span> <span class='diff-add'> this.kernel.clear_callbacks_for_msg(old_msg_id);</span> <span class='diff-add'> if (old_msg_id) {</span> <span class='diff-add'> delete CodeCell.msg_cells[old_msg_id];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.get_text().trim().length === 0) {</span> <span class='diff-add'> // nothing to do</span> <span class='diff-add'> this.set_input_prompt(null);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.set_input_prompt('*');</span> <span class='diff-add'> this.element.addClass("running");</span> <span class='diff-add'> var callbacks = this.get_callbacks();</span> <span class='diff-add'> </span> <span class='diff-add'> this.last_msg_id = this.kernel.execute(this.get_text(), callbacks, {silent: false, store_history: true,</span> <span class='diff-add'> stop_on_error : stop_on_error});</span> <span class='diff-add'> CodeCell.msg_cells[this.last_msg_id] = this;</span> <span class='diff-add'> this.render();</span> <span class='diff-add'> this.events.trigger('execute.CodeCell', {cell: this});</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Construct the default callbacks for</span> <span class='diff-add'> * @method get_callbacks</span> <span class='diff-add'> */</span> <span class='diff-add'> CodeCell.prototype.get_callbacks = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> return {</span> <span class='diff-add'> shell : {</span> <span class='diff-add'> reply : $.proxy(this._handle_execute_reply, this),</span> <span class='diff-add'> payload : {</span> <span class='diff-add'> set_next_input : $.proxy(this._handle_set_next_input, this),</span> <span class='diff-add'> page : $.proxy(this._open_with_pager, this)</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> iopub : {</span> <span class='diff-add'> output : function() { </span> <span class='diff-add'> that.output_area.handle_output.apply(that.output_area, arguments);</span> <span class='diff-add'> }, </span> <span class='diff-add'> clear_output : function() { </span> <span class='diff-add'> that.output_area.handle_clear_output.apply(that.output_area, arguments);</span> <span class='diff-add'> }, </span> <span class='diff-add'> },</span> <span class='diff-add'> input : $.proxy(this._handle_input_request, this)</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> CodeCell.prototype._open_with_pager = function (payload) {</span> <span class='diff-add'> this.events.trigger('open_with_text.Pager', payload);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @method _handle_execute_reply</span> <span class='diff-add'> * @private</span> <span class='diff-add'> */</span> <span class='diff-add'> CodeCell.prototype._handle_execute_reply = function (msg) {</span> <span class='diff-add'> this.set_input_prompt(msg.content.execution_count);</span> <span class='diff-add'> this.element.removeClass("running");</span> <span class='diff-add'> this.events.trigger('set_dirty.Notebook', {value: true});</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @method _handle_set_next_input</span> <span class='diff-add'> * @private</span> <span class='diff-add'> */</span> <span class='diff-add'> CodeCell.prototype._handle_set_next_input = function (payload) {</span> <span class='diff-add'> var data = {'cell': this, 'text': payload.text, replace: payload.replace};</span> <span class='diff-add'> this.events.trigger('set_next_input.Notebook', data);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @method _handle_input_request</span> <span class='diff-add'> * @private</span> <span class='diff-add'> */</span> <span class='diff-add'> CodeCell.prototype._handle_input_request = function (msg) {</span> <span class='diff-add'> this.output_area.append_raw_input(msg);</span> <span class='diff-add'> };</span> <span class='diff-add'> // Basic cell manipulation.</span> <span class='diff-add'> CodeCell.prototype.select = function () {</span> <span class='diff-add'> var cont = Cell.prototype.select.apply(this);</span> <span class='diff-add'> if (cont) {</span> <span class='diff-add'> this.code_mirror.refresh();</span> <span class='diff-add'> this.auto_highlight();</span> <span class='diff-add'> }</span> <span class='diff-add'> return cont;</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.prototype.render = function () {</span> <span class='diff-add'> var cont = Cell.prototype.render.apply(this);</span> <span class='diff-add'> // Always execute, even if we are already in the rendered state</span> <span class='diff-add'> return cont;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> CodeCell.prototype.select_all = function () {</span> <span class='diff-add'> var start = {line: 0, ch: 0};</span> <span class='diff-add'> var nlines = this.code_mirror.lineCount();</span> <span class='diff-add'> var last_line = this.code_mirror.getLine(nlines-1);</span> <span class='diff-add'> var end = {line: nlines-1, ch: last_line.length};</span> <span class='diff-add'> this.code_mirror.setSelection(start, end);</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.prototype.collapse_output = function () {</span> <span class='diff-add'> this.output_area.collapse();</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.prototype.expand_output = function () {</span> <span class='diff-add'> this.output_area.expand();</span> <span class='diff-add'> this.output_area.unscroll_area();</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.prototype.scroll_output = function () {</span> <span class='diff-add'> this.output_area.expand();</span> <span class='diff-add'> this.output_area.scroll_if_long();</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.prototype.toggle_output = function () {</span> <span class='diff-add'> this.output_area.toggle_output();</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.prototype.toggle_output_scroll = function () {</span> <span class='diff-add'> this.output_area.toggle_scroll();</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.input_prompt_classical = function (prompt_value, lines_number) {</span> <span class='diff-add'> var ns;</span> <span class='diff-add'> if (prompt_value === undefined || prompt_value === null) {</span> <span class='diff-add'> ns = " ";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> ns = encodeURIComponent(prompt_value);</span> <span class='diff-add'> }</span> <span class='diff-add'> return 'In [' + ns + ']:';</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.input_prompt_continuation = function (prompt_value, lines_number) {</span> <span class='diff-add'> var html = [CodeCell.input_prompt_classical(prompt_value, lines_number)];</span> <span class='diff-add'> for(var i=1; i < lines_number; i++) {</span> <span class='diff-add'> html.push(['...:']);</span> <span class='diff-add'> }</span> <span class='diff-add'> return html.join('<br/>');</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.input_prompt_function = CodeCell.input_prompt_classical;</span> <span class='diff-add'> CodeCell.prototype.set_input_prompt = function (number) {</span> <span class='diff-add'> var nline = 1;</span> <span class='diff-add'> if (this.code_mirror !== undefined) {</span> <span class='diff-add'> nline = this.code_mirror.lineCount();</span> <span class='diff-add'> }</span> <span class='diff-add'> this.input_prompt_number = number;</span> <span class='diff-add'> var prompt_html = CodeCell.input_prompt_function(this.input_prompt_number, nline);</span> <span class='diff-add'> // This HTML call is okay because the user contents are escaped.</span> <span class='diff-add'> this.element.find('div.input_prompt').html(prompt_html);</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.prototype.clear_input = function () {</span> <span class='diff-add'> this.code_mirror.setValue('');</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.prototype.get_text = function () {</span> <span class='diff-add'> return this.code_mirror.getValue();</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.prototype.set_text = function (code) {</span> <span class='diff-add'> return this.code_mirror.setValue(code);</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.prototype.clear_output = function (wait) {</span> <span class='diff-add'> this.output_area.clear_output(wait);</span> <span class='diff-add'> this.set_input_prompt();</span> <span class='diff-add'> };</span> <span class='diff-add'> // JSON serialization</span> <span class='diff-add'> CodeCell.prototype.fromJSON = function (data) {</span> <span class='diff-add'> Cell.prototype.fromJSON.apply(this, arguments);</span> <span class='diff-add'> if (data.cell_type === 'code') {</span> <span class='diff-add'> if (data.source !== undefined) {</span> <span class='diff-add'> this.set_text(data.source);</span> <span class='diff-add'> // make this value the starting point, so that we can only undo</span> <span class='diff-add'> // to this state, instead of a blank cell</span> <span class='diff-add'> this.code_mirror.clearHistory();</span> <span class='diff-add'> this.auto_highlight();</span> <span class='diff-add'> }</span> <span class='diff-add'> this.set_input_prompt(data.execution_count);</span> <span class='diff-add'> this.output_area.trusted = data.metadata.trusted || false;</span> <span class='diff-add'> this.output_area.fromJSON(data.outputs, data.metadata);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeCell.prototype.toJSON = function () {</span> <span class='diff-add'> var data = Cell.prototype.toJSON.apply(this);</span> <span class='diff-add'> data.source = this.get_text();</span> <span class='diff-add'> // is finite protect against undefined and '*' value</span> <span class='diff-add'> if (isFinite(this.input_prompt_number)) {</span> <span class='diff-add'> data.execution_count = this.input_prompt_number;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> data.execution_count = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> var outputs = this.output_area.toJSON();</span> <span class='diff-add'> data.outputs = outputs;</span> <span class='diff-add'> data.metadata.trusted = this.output_area.trusted;</span> <span class='diff-add'> data.metadata.collapsed = this.output_area.collapsed;</span> <span class='diff-add'> if (this.output_area.scroll_state === 'auto') {</span> <span class='diff-add'> delete data.metadata.scrolled;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> data.metadata.scrolled = this.output_area.scroll_state;</span> <span class='diff-add'> }</span> <span class='diff-add'> return data;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * handle cell level logic when a cell is unselected</span> <span class='diff-add'> * @method unselect</span> <span class='diff-add'> * @return is the action being taken</span> <span class='diff-add'> */</span> <span class='diff-add'> CodeCell.prototype.unselect = function () {</span> <span class='diff-add'> var cont = Cell.prototype.unselect.apply(this);</span> <span class='diff-add'> if (cont) {</span> <span class='diff-add'> // When a code cell is usnelected, make sure that the corresponding</span> <span class='diff-add'> // tooltip and completer to that cell is closed.</span> <span class='diff-add'> this.tooltip.remove_and_cancel_tooltip(true);</span> <span class='diff-add'> if (this.completer !== null) {</span> <span class='diff-add'> this.completer.close();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return cont;</span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatability.</span> <span class='diff-add'> IPython.CodeCell = CodeCell;</span> <span class='diff-add'> return {'CodeCell': CodeCell};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/codemirror-ipython.js b/ipynb/Array-feature-overlap-05_files/codemirror-ipython.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..b58229a</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/codemirror-ipython.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// IPython mode is just a slightly altered Python Mode with `?` beeing a extra</span> <span class='diff-add'>// single operator. Here we define `ipython` mode in the require `python`</span> <span class='diff-add'>// callback to auto-load python mode, which is more likely not the best things</span> <span class='diff-add'>// to do, but at least the simple one for now.</span> <span class='diff-add'>(function(mod) {</span> <span class='diff-add'> if (typeof exports == "object" && typeof module == "object"){ // CommonJS</span> <span class='diff-add'> mod(require("codemirror/lib/codemirror"),</span> <span class='diff-add'> require("codemirror/mode/python/python")</span> <span class='diff-add'> );</span> <span class='diff-add'> } else if (typeof define == "function" && define.amd){ // AMD</span> <span class='diff-add'> define(["codemirror/lib/codemirror",</span> <span class='diff-add'> "codemirror/mode/python/python"], mod);</span> <span class='diff-add'> } else {// Plain browser env</span> <span class='diff-add'> mod(CodeMirror);</span> <span class='diff-add'> }</span> <span class='diff-add'>})(function(CodeMirror) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> CodeMirror.defineMode("ipython", function(conf, parserConf) {</span> <span class='diff-add'> var pythonConf = {};</span> <span class='diff-add'> for (var prop in parserConf) {</span> <span class='diff-add'> if (parserConf.hasOwnProperty(prop)) {</span> <span class='diff-add'> pythonConf[prop] = parserConf[prop];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> pythonConf.name = 'python';</span> <span class='diff-add'> pythonConf.singleOperators = new RegExp("^[\\+\\-\\*/%&|\\^~<>!\\?]");</span> <span class='diff-add'> if (pythonConf.version === 3) {</span> <span class='diff-add'> pythonConf.identifiers = new RegExp("^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*");</span> <span class='diff-add'> } else if (pythonConf.version === 2) {</span> <span class='diff-add'> pythonConf.identifiers = new RegExp("^[_A-Za-z][_A-Za-z0-9]*");</span> <span class='diff-add'> }</span> <span class='diff-add'> return CodeMirror.getMode(conf, pythonConf);</span> <span class='diff-add'> }, 'python');</span> <span class='diff-add'> CodeMirror.defineMIME("text/x-ipython", "ipython");</span> <span class='diff-add'>})</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/codemirror-ipythongfm.js b/ipynb/Array-feature-overlap-05_files/codemirror-ipythongfm.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..9a6bbc3</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/codemirror-ipythongfm.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// IPython GFM (GitHub Flavored Markdown) mode is just a slightly altered GFM</span> <span class='diff-add'>// Mode with support for latex.</span> <span class='diff-add'>//</span> <span class='diff-add'>// Latex support was supported by Codemirror GFM as of</span> <span class='diff-add'>// https://github.com/codemirror/CodeMirror/pull/567</span> <span class='diff-add'>// But was later removed in</span> <span class='diff-add'>// https://github.com/codemirror/CodeMirror/commit/d9c9f1b1ffe984aee41307f3e927f80d1f23590c</span> <span class='diff-add'>(function(mod) {</span> <span class='diff-add'> if (typeof exports == "object" && typeof module == "object"){ // CommonJS</span> <span class='diff-add'> mod(require("codemirror/lib/codemirror")</span> <span class='diff-add'> ,require("codemirror/addon/mode/multiplex")</span> <span class='diff-add'> ,require("codemirror/mode/gfm/gfm")</span> <span class='diff-add'> ,require("codemirror/mode/stex/stex")</span> <span class='diff-add'> );</span> <span class='diff-add'> } else if (typeof define == "function" && define.amd){ // AMD</span> <span class='diff-add'> define(["codemirror/lib/codemirror"</span> <span class='diff-add'> ,"codemirror/addon/mode/multiplex"</span> <span class='diff-add'> ,"codemirror/mode/python/python"</span> <span class='diff-add'> ,"codemirror/mode/stex/stex"</span> <span class='diff-add'> ], mod);</span> <span class='diff-add'> } else {// Plain browser env</span> <span class='diff-add'> mod(CodeMirror);</span> <span class='diff-add'> }</span> <span class='diff-add'>})( function(CodeMirror){</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> CodeMirror.defineMode("ipythongfm", function(config, parserConfig) {</span> <span class='diff-add'> var gfm_mode = CodeMirror.getMode(config, "gfm");</span> <span class='diff-add'> var tex_mode = CodeMirror.getMode(config, "stex");</span> <span class='diff-add'> return CodeMirror.multiplexingMode(</span> <span class='diff-add'> gfm_mode,</span> <span class='diff-add'> {</span> <span class='diff-add'> open: "$", close: "$",</span> <span class='diff-add'> mode: tex_mode,</span> <span class='diff-add'> delimStyle: "delimit"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> // not sure this works as $$ is interpreted at (opening $, closing $, as defined just above)</span> <span class='diff-add'> open: "$$", close: "$$",</span> <span class='diff-add'> mode: tex_mode,</span> <span class='diff-add'> delimStyle: "delimit"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> open: "\\(", close: "\\)",</span> <span class='diff-add'> mode: tex_mode,</span> <span class='diff-add'> delimStyle: "delimit"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> open: "\\[", close: "\\]",</span> <span class='diff-add'> mode: tex_mode,</span> <span class='diff-add'> delimStyle: "delimit"</span> <span class='diff-add'> }</span> <span class='diff-add'> // .. more multiplexed styles can follow here</span> <span class='diff-add'> );</span> <span class='diff-add'> }, 'gfm');</span> <span class='diff-add'> CodeMirror.defineMIME("text/x-ipythongfm", "ipythongfm");</span> <span class='diff-add'>})</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/codemirror.js b/ipynb/Array-feature-overlap-05_files/codemirror.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..038a894</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/codemirror.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span> <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span> <span class='diff-add'>// This is CodeMirror (http://codemirror.net), a code editor</span> <span class='diff-add'>// implemented in JavaScript on top of the browser's DOM.</span> <span class='diff-add'>//</span> <span class='diff-add'>// You can find some technical background for some of the code below</span> <span class='diff-add'>// at http://marijnhaverbeke.nl/blog/#cm-internals .</span> <span class='diff-add'>(function(mod) {</span> <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span> <span class='diff-add'> module.exports = mod();</span> <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span> <span class='diff-add'> return define([], mod);</span> <span class='diff-add'> else // Plain browser env</span> <span class='diff-add'> this.CodeMirror = mod();</span> <span class='diff-add'>})(function() {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> // BROWSER SNIFFING</span> <span class='diff-add'> // Kludges for bugs and behavior differences that can't be feature</span> <span class='diff-add'> // detected are enabled based on userAgent etc sniffing.</span> <span class='diff-add'> var gecko = /gecko\/\d/i.test(navigator.userAgent);</span> <span class='diff-add'> // ie_uptoN means Internet Explorer version N or lower</span> <span class='diff-add'> var ie_upto10 = /MSIE \d/.test(navigator.userAgent);</span> <span class='diff-add'> var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);</span> <span class='diff-add'> var ie = ie_upto10 || ie_11up;</span> <span class='diff-add'> var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : ie_11up[1]);</span> <span class='diff-add'> var webkit = /WebKit\//.test(navigator.userAgent);</span> <span class='diff-add'> var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent);</span> <span class='diff-add'> var chrome = /Chrome\//.test(navigator.userAgent);</span> <span class='diff-add'> var presto = /Opera\//.test(navigator.userAgent);</span> <span class='diff-add'> var safari = /Apple Computer/.test(navigator.vendor);</span> <span class='diff-add'> var khtml = /KHTML\//.test(navigator.userAgent);</span> <span class='diff-add'> var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent);</span> <span class='diff-add'> var phantom = /PhantomJS/.test(navigator.userAgent);</span> <span class='diff-add'> var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent);</span> <span class='diff-add'> // This is woefully incomplete. Suggestions for alternative methods welcome.</span> <span class='diff-add'> var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);</span> <span class='diff-add'> var mac = ios || /Mac/.test(navigator.platform);</span> <span class='diff-add'> var windows = /win/i.test(navigator.platform);</span> <span class='diff-add'> var presto_version = presto && navigator.userAgent.match(/Version\/(\d*\.\d*)/);</span> <span class='diff-add'> if (presto_version) presto_version = Number(presto_version[1]);</span> <span class='diff-add'> if (presto_version && presto_version >= 15) { presto = false; webkit = true; }</span> <span class='diff-add'> // Some browsers use the wrong event properties to signal cmd/ctrl on OS X</span> <span class='diff-add'> var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));</span> <span class='diff-add'> var captureRightClick = gecko || (ie && ie_version >= 9);</span> <span class='diff-add'> // Optimize some code when these features are not used.</span> <span class='diff-add'> var sawReadOnlySpans = false, sawCollapsedSpans = false;</span> <span class='diff-add'> // EDITOR CONSTRUCTOR</span> <span class='diff-add'> // A CodeMirror instance represents an editor. This is the object</span> <span class='diff-add'> // that user code is usually dealing with.</span> <span class='diff-add'> function CodeMirror(place, options) {</span> <span class='diff-add'> if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);</span> <span class='diff-add'> this.options = options = options ? copyObj(options) : {};</span> <span class='diff-add'> // Determine effective options based on given values and defaults.</span> <span class='diff-add'> copyObj(defaults, options, false);</span> <span class='diff-add'> setGuttersForLineNumbers(options);</span> <span class='diff-add'> var doc = options.value;</span> <span class='diff-add'> if (typeof doc == "string") doc = new Doc(doc, options.mode);</span> <span class='diff-add'> this.doc = doc;</span> <span class='diff-add'> var display = this.display = new Display(place, doc);</span> <span class='diff-add'> display.wrapper.CodeMirror = this;</span> <span class='diff-add'> updateGutters(this);</span> <span class='diff-add'> themeChanged(this);</span> <span class='diff-add'> if (options.lineWrapping)</span> <span class='diff-add'> this.display.wrapper.className += " CodeMirror-wrap";</span> <span class='diff-add'> if (options.autofocus && !mobile) focusInput(this);</span> <span class='diff-add'> initScrollbars(this);</span> <span class='diff-add'> this.state = {</span> <span class='diff-add'> keyMaps: [], // stores maps added by addKeyMap</span> <span class='diff-add'> overlays: [], // highlighting overlays, as added by addOverlay</span> <span class='diff-add'> modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info</span> <span class='diff-add'> overwrite: false, focused: false,</span> <span class='diff-add'> suppressEdits: false, // used to disable editing during key handlers when in readOnly mode</span> <span class='diff-add'> pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in readInput</span> <span class='diff-add'> draggingText: false,</span> <span class='diff-add'> highlight: new Delayed(), // stores highlight worker timeout</span> <span class='diff-add'> keySeq: null // Unfinished key sequence</span> <span class='diff-add'> };</span> <span class='diff-add'> // Override magic textarea content restore that IE sometimes does</span> <span class='diff-add'> // on our hidden textarea on reload</span> <span class='diff-add'> if (ie && ie_version < 11) setTimeout(bind(resetInput, this, true), 20);</span> <span class='diff-add'> registerEventHandlers(this);</span> <span class='diff-add'> ensureGlobalHandlers();</span> <span class='diff-add'> startOperation(this);</span> <span class='diff-add'> this.curOp.forceUpdate = true;</span> <span class='diff-add'> attachDoc(this, doc);</span> <span class='diff-add'> if ((options.autofocus && !mobile) || activeElt() == display.input)</span> <span class='diff-add'> setTimeout(bind(onFocus, this), 20);</span> <span class='diff-add'> else</span> <span class='diff-add'> onBlur(this);</span> <span class='diff-add'> for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))</span> <span class='diff-add'> optionHandlers[opt](this, options[opt], Init);</span> <span class='diff-add'> maybeUpdateLineNumberWidth(this);</span> <span class='diff-add'> for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);</span> <span class='diff-add'> endOperation(this);</span> <span class='diff-add'> }</span> <span class='diff-add'> // DISPLAY CONSTRUCTOR</span> <span class='diff-add'> // The display handles the DOM integration, both for input reading</span> <span class='diff-add'> // and content drawing. It holds references to DOM nodes and</span> <span class='diff-add'> // display-related state.</span> <span class='diff-add'> function Display(place, doc) {</span> <span class='diff-add'> var d = this;</span> <span class='diff-add'> // The semihidden textarea that is focused when the editor is</span> <span class='diff-add'> // focused, and receives input.</span> <span class='diff-add'> var input = d.input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none");</span> <span class='diff-add'> // The textarea is kept positioned near the cursor to prevent the</span> <span class='diff-add'> // fact that it'll be scrolled into view on input from scrolling</span> <span class='diff-add'> // our fake cursor out of view. On webkit, when wrap=off, paste is</span> <span class='diff-add'> // very slow. So make the area wide instead.</span> <span class='diff-add'> if (webkit) input.style.width = "1000px";</span> <span class='diff-add'> else input.setAttribute("wrap", "off");</span> <span class='diff-add'> // If border: 0; -- iOS fails to open keyboard (issue #1287)</span> <span class='diff-add'> if (ios) input.style.border = "1px solid black";</span> <span class='diff-add'> input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); input.setAttribute("spellcheck", "false");</span> <span class='diff-add'> // Wraps and hides input textarea</span> <span class='diff-add'> d.inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");</span> <span class='diff-add'> // Covers bottom-right square when both scrollbars are present.</span> <span class='diff-add'> d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");</span> <span class='diff-add'> d.scrollbarFiller.setAttribute("not-content", "true");</span> <span class='diff-add'> // Covers bottom of gutter when coverGutterNextToScrollbar is on</span> <span class='diff-add'> // and h scrollbar is present.</span> <span class='diff-add'> d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");</span> <span class='diff-add'> d.gutterFiller.setAttribute("not-content", "true");</span> <span class='diff-add'> // Will contain the actual code, positioned to cover the viewport.</span> <span class='diff-add'> d.lineDiv = elt("div", null, "CodeMirror-code");</span> <span class='diff-add'> // Elements are added to these to represent selection and cursors.</span> <span class='diff-add'> d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");</span> <span class='diff-add'> d.cursorDiv = elt("div", null, "CodeMirror-cursors");</span> <span class='diff-add'> // A visibility: hidden element used to find the size of things.</span> <span class='diff-add'> d.measure = elt("div", null, "CodeMirror-measure");</span> <span class='diff-add'> // When lines outside of the viewport are measured, they are drawn in this.</span> <span class='diff-add'> d.lineMeasure = elt("div", null, "CodeMirror-measure");</span> <span class='diff-add'> // Wraps everything that needs to exist inside the vertically-padded coordinate system</span> <span class='diff-add'> d.lineSpace = elt("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],</span> <span class='diff-add'> null, "position: relative; outline: none");</span> <span class='diff-add'> // Moved around its parent to cover visible view.</span> <span class='diff-add'> d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative");</span> <span class='diff-add'> // Set to the height of the document, allowing scrolling.</span> <span class='diff-add'> d.sizer = elt("div", [d.mover], "CodeMirror-sizer");</span> <span class='diff-add'> d.sizerWidth = null;</span> <span class='diff-add'> // Behavior of elts with overflow: auto and padding is</span> <span class='diff-add'> // inconsistent across browsers. This is used to ensure the</span> <span class='diff-add'> // scrollable area is big enough.</span> <span class='diff-add'> d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;");</span> <span class='diff-add'> // Will contain the gutters, if any.</span> <span class='diff-add'> d.gutters = elt("div", null, "CodeMirror-gutters");</span> <span class='diff-add'> d.lineGutter = null;</span> <span class='diff-add'> // Actual scrollable element.</span> <span class='diff-add'> d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");</span> <span class='diff-add'> d.scroller.setAttribute("tabIndex", "-1");</span> <span class='diff-add'> // The element in which the editor lives.</span> <span class='diff-add'> d.wrapper = elt("div", [d.inputDiv, d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");</span> <span class='diff-add'> // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)</span> <span class='diff-add'> if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }</span> <span class='diff-add'> // Needed to hide big blue blinking cursor on Mobile Safari</span> <span class='diff-add'> if (ios) input.style.width = "0px";</span> <span class='diff-add'> if (!webkit) d.scroller.draggable = true;</span> <span class='diff-add'> // Needed to handle Tab key in KHTML</span> <span class='diff-add'> if (khtml) { d.inputDiv.style.height = "1px"; d.inputDiv.style.position = "absolute"; }</span> <span class='diff-add'> if (place) {</span> <span class='diff-add'> if (place.appendChild) place.appendChild(d.wrapper);</span> <span class='diff-add'> else place(d.wrapper);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Current rendered range (may be bigger than the view window).</span> <span class='diff-add'> d.viewFrom = d.viewTo = doc.first;</span> <span class='diff-add'> d.reportedViewFrom = d.reportedViewTo = doc.first;</span> <span class='diff-add'> // Information about the rendered lines.</span> <span class='diff-add'> d.view = [];</span> <span class='diff-add'> d.renderedView = null;</span> <span class='diff-add'> // Holds info about a single rendered line when it was rendered</span> <span class='diff-add'> // for measurement, while not in view.</span> <span class='diff-add'> d.externalMeasured = null;</span> <span class='diff-add'> // Empty space (in pixels) above the view</span> <span class='diff-add'> d.viewOffset = 0;</span> <span class='diff-add'> d.lastWrapHeight = d.lastWrapWidth = 0;</span> <span class='diff-add'> d.updateLineNumbers = null;</span> <span class='diff-add'> d.nativeBarWidth = d.barHeight = d.barWidth = 0;</span> <span class='diff-add'> d.scrollbarsClipped = false;</span> <span class='diff-add'> // Used to only resize the line number gutter when necessary (when</span> <span class='diff-add'> // the amount of lines crosses a boundary that makes its width change)</span> <span class='diff-add'> d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;</span> <span class='diff-add'> // See readInput and resetInput</span> <span class='diff-add'> d.prevInput = "";</span> <span class='diff-add'> // Set to true when a non-horizontal-scrolling line widget is</span> <span class='diff-add'> // added. As an optimization, line widget aligning is skipped when</span> <span class='diff-add'> // this is false.</span> <span class='diff-add'> d.alignWidgets = false;</span> <span class='diff-add'> // Flag that indicates whether we expect input to appear real soon</span> <span class='diff-add'> // now (after some event like 'keypress' or 'input') and are</span> <span class='diff-add'> // polling intensively.</span> <span class='diff-add'> d.pollingFast = false;</span> <span class='diff-add'> // Self-resetting timeout for the poller</span> <span class='diff-add'> d.poll = new Delayed();</span> <span class='diff-add'> d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;</span> <span class='diff-add'> // Tracks when resetInput has punted to just putting a short</span> <span class='diff-add'> // string into the textarea instead of the full selection.</span> <span class='diff-add'> d.inaccurateSelection = false;</span> <span class='diff-add'> // Tracks the maximum line length so that the horizontal scrollbar</span> <span class='diff-add'> // can be kept static when scrolling.</span> <span class='diff-add'> d.maxLine = null;</span> <span class='diff-add'> d.maxLineLength = 0;</span> <span class='diff-add'> d.maxLineChanged = false;</span> <span class='diff-add'> // Used for measuring wheel scrolling granularity</span> <span class='diff-add'> d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;</span> <span class='diff-add'> // True when shift is held down.</span> <span class='diff-add'> d.shift = false;</span> <span class='diff-add'> // Used to track whether anything happened since the context menu</span> <span class='diff-add'> // was opened.</span> <span class='diff-add'> d.selForContextMenu = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> // STATE UPDATES</span> <span class='diff-add'> // Used to get the editor into a consistent state again when options change.</span> <span class='diff-add'> function loadMode(cm) {</span> <span class='diff-add'> cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);</span> <span class='diff-add'> resetModeState(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> function resetModeState(cm) {</span> <span class='diff-add'> cm.doc.iter(function(line) {</span> <span class='diff-add'> if (line.stateAfter) line.stateAfter = null;</span> <span class='diff-add'> if (line.styles) line.styles = null;</span> <span class='diff-add'> });</span> <span class='diff-add'> cm.doc.frontier = cm.doc.first;</span> <span class='diff-add'> startWorker(cm, 100);</span> <span class='diff-add'> cm.state.modeGen++;</span> <span class='diff-add'> if (cm.curOp) regChange(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> function wrappingChanged(cm) {</span> <span class='diff-add'> if (cm.options.lineWrapping) {</span> <span class='diff-add'> addClass(cm.display.wrapper, "CodeMirror-wrap");</span> <span class='diff-add'> cm.display.sizer.style.minWidth = "";</span> <span class='diff-add'> cm.display.sizerWidth = null;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> rmClass(cm.display.wrapper, "CodeMirror-wrap");</span> <span class='diff-add'> findMaxLine(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> estimateLineHeights(cm);</span> <span class='diff-add'> regChange(cm);</span> <span class='diff-add'> clearCaches(cm);</span> <span class='diff-add'> setTimeout(function(){updateScrollbars(cm);}, 100);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Returns a function that estimates the height of a line, to use as</span> <span class='diff-add'> // first approximation until the line becomes visible (and is thus</span> <span class='diff-add'> // properly measurable).</span> <span class='diff-add'> function estimateHeight(cm) {</span> <span class='diff-add'> var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;</span> <span class='diff-add'> var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);</span> <span class='diff-add'> return function(line) {</span> <span class='diff-add'> if (lineIsHidden(cm.doc, line)) return 0;</span> <span class='diff-add'> var widgetsHeight = 0;</span> <span class='diff-add'> if (line.widgets) for (var i = 0; i < line.widgets.length; i++) {</span> <span class='diff-add'> if (line.widgets[i].height) widgetsHeight += line.widgets[i].height;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (wrapping)</span> <span class='diff-add'> return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th;</span> <span class='diff-add'> else</span> <span class='diff-add'> return widgetsHeight + th;</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> function estimateLineHeights(cm) {</span> <span class='diff-add'> var doc = cm.doc, est = estimateHeight(cm);</span> <span class='diff-add'> doc.iter(function(line) {</span> <span class='diff-add'> var estHeight = est(line);</span> <span class='diff-add'> if (estHeight != line.height) updateLineHeight(line, estHeight);</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> function themeChanged(cm) {</span> <span class='diff-add'> cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +</span> <span class='diff-add'> cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");</span> <span class='diff-add'> clearCaches(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> function guttersChanged(cm) {</span> <span class='diff-add'> updateGutters(cm);</span> <span class='diff-add'> regChange(cm);</span> <span class='diff-add'> setTimeout(function(){alignHorizontally(cm);}, 20);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Rebuild the gutter elements, ensure the margin to the left of the</span> <span class='diff-add'> // code matches their width.</span> <span class='diff-add'> function updateGutters(cm) {</span> <span class='diff-add'> var gutters = cm.display.gutters, specs = cm.options.gutters;</span> <span class='diff-add'> removeChildren(gutters);</span> <span class='diff-add'> for (var i = 0; i < specs.length; ++i) {</span> <span class='diff-add'> var gutterClass = specs[i];</span> <span class='diff-add'> var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass));</span> <span class='diff-add'> if (gutterClass == "CodeMirror-linenumbers") {</span> <span class='diff-add'> cm.display.lineGutter = gElt;</span> <span class='diff-add'> gElt.style.width = (cm.display.lineNumWidth || 1) + "px";</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> gutters.style.display = i ? "" : "none";</span> <span class='diff-add'> updateGutterSpace(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> function updateGutterSpace(cm) {</span> <span class='diff-add'> var width = cm.display.gutters.offsetWidth;</span> <span class='diff-add'> cm.display.sizer.style.marginLeft = width + "px";</span> <span class='diff-add'> }</span> <span class='diff-add'> // Compute the character length of a line, taking into account</span> <span class='diff-add'> // collapsed ranges (see markText) that might hide parts, and join</span> <span class='diff-add'> // other lines onto it.</span> <span class='diff-add'> function lineLength(line) {</span> <span class='diff-add'> if (line.height == 0) return 0;</span> <span class='diff-add'> var len = line.text.length, merged, cur = line;</span> <span class='diff-add'> while (merged = collapsedSpanAtStart(cur)) {</span> <span class='diff-add'> var found = merged.find(0, true);</span> <span class='diff-add'> cur = found.from.line;</span> <span class='diff-add'> len += found.from.ch - found.to.ch;</span> <span class='diff-add'> }</span> <span class='diff-add'> cur = line;</span> <span class='diff-add'> while (merged = collapsedSpanAtEnd(cur)) {</span> <span class='diff-add'> var found = merged.find(0, true);</span> <span class='diff-add'> len -= cur.text.length - found.from.ch;</span> <span class='diff-add'> cur = found.to.line;</span> <span class='diff-add'> len += cur.text.length - found.to.ch;</span> <span class='diff-add'> }</span> <span class='diff-add'> return len;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Find the longest line in the document.</span> <span class='diff-add'> function findMaxLine(cm) {</span> <span class='diff-add'> var d = cm.display, doc = cm.doc;</span> <span class='diff-add'> d.maxLine = getLine(doc, doc.first);</span> <span class='diff-add'> d.maxLineLength = lineLength(d.maxLine);</span> <span class='diff-add'> d.maxLineChanged = true;</span> <span class='diff-add'> doc.iter(function(line) {</span> <span class='diff-add'> var len = lineLength(line);</span> <span class='diff-add'> if (len > d.maxLineLength) {</span> <span class='diff-add'> d.maxLineLength = len;</span> <span class='diff-add'> d.maxLine = line;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> // Make sure the gutters options contains the element</span> <span class='diff-add'> // "CodeMirror-linenumbers" when the lineNumbers option is true.</span> <span class='diff-add'> function setGuttersForLineNumbers(options) {</span> <span class='diff-add'> var found = indexOf(options.gutters, "CodeMirror-linenumbers");</span> <span class='diff-add'> if (found == -1 && options.lineNumbers) {</span> <span class='diff-add'> options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]);</span> <span class='diff-add'> } else if (found > -1 && !options.lineNumbers) {</span> <span class='diff-add'> options.gutters = options.gutters.slice(0);</span> <span class='diff-add'> options.gutters.splice(found, 1);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // SCROLLBARS</span> <span class='diff-add'> // Prepare DOM reads needed to update the scrollbars. Done in one</span> <span class='diff-add'> // shot to minimize update/measure roundtrips.</span> <span class='diff-add'> function measureForScrollbars(cm) {</span> <span class='diff-add'> var d = cm.display, gutterW = d.gutters.offsetWidth;</span> <span class='diff-add'> var docH = Math.round(cm.doc.height + paddingVert(cm.display));</span> <span class='diff-add'> return {</span> <span class='diff-add'> clientHeight: d.scroller.clientHeight,</span> <span class='diff-add'> viewHeight: d.wrapper.clientHeight,</span> <span class='diff-add'> scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,</span> <span class='diff-add'> viewWidth: d.wrapper.clientWidth,</span> <span class='diff-add'> barLeft: cm.options.fixedGutter ? gutterW : 0,</span> <span class='diff-add'> docHeight: docH,</span> <span class='diff-add'> scrollHeight: docH + scrollGap(cm) + d.barHeight,</span> <span class='diff-add'> nativeBarWidth: d.nativeBarWidth,</span> <span class='diff-add'> gutterWidth: gutterW</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> function NativeScrollbars(place, scroll, cm) {</span> <span class='diff-add'> this.cm = cm;</span> <span class='diff-add'> var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar");</span> <span class='diff-add'> var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");</span> <span class='diff-add'> place(vert); place(horiz);</span> <span class='diff-add'> on(vert, "scroll", function() {</span> <span class='diff-add'> if (vert.clientHeight) scroll(vert.scrollTop, "vertical");</span> <span class='diff-add'> });</span> <span class='diff-add'> on(horiz, "scroll", function() {</span> <span class='diff-add'> if (horiz.clientWidth) scroll(horiz.scrollLeft, "horizontal");</span> <span class='diff-add'> });</span> <span class='diff-add'> this.checkedOverlay = false;</span> <span class='diff-add'> // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).</span> <span class='diff-add'> if (ie && ie_version < 8) this.horiz.style.minHeight = this.vert.style.minWidth = "18px";</span> <span class='diff-add'> }</span> <span class='diff-add'> NativeScrollbars.prototype = copyObj({</span> <span class='diff-add'> update: function(measure) {</span> <span class='diff-add'> var needsH = measure.scrollWidth > measure.clientWidth + 1;</span> <span class='diff-add'> var needsV = measure.scrollHeight > measure.clientHeight + 1;</span> <span class='diff-add'> var sWidth = measure.nativeBarWidth;</span> <span class='diff-add'> if (needsV) {</span> <span class='diff-add'> this.vert.style.display = "block";</span> <span class='diff-add'> this.vert.style.bottom = needsH ? sWidth + "px" : "0";</span> <span class='diff-add'> var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);</span> <span class='diff-add'> // A bug in IE8 can cause this value to be negative, so guard it.</span> <span class='diff-add'> this.vert.firstChild.style.height =</span> <span class='diff-add'> Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.vert.style.display = "";</span> <span class='diff-add'> this.vert.firstChild.style.height = "0";</span> <span class='diff-add'> }</span> <span class='diff-add'> if (needsH) {</span> <span class='diff-add'> this.horiz.style.display = "block";</span> <span class='diff-add'> this.horiz.style.right = needsV ? sWidth + "px" : "0";</span> <span class='diff-add'> this.horiz.style.left = measure.barLeft + "px";</span> <span class='diff-add'> var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);</span> <span class='diff-add'> this.horiz.firstChild.style.width =</span> <span class='diff-add'> (measure.scrollWidth - measure.clientWidth + totalWidth) + "px";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.horiz.style.display = "";</span> <span class='diff-add'> this.horiz.firstChild.style.width = "0";</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!this.checkedOverlay && measure.clientHeight > 0) {</span> <span class='diff-add'> if (sWidth == 0) this.overlayHack();</span> <span class='diff-add'> this.checkedOverlay = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0};</span> <span class='diff-add'> },</span> <span class='diff-add'> setScrollLeft: function(pos) {</span> <span class='diff-add'> if (this.horiz.scrollLeft != pos) this.horiz.scrollLeft = pos;</span> <span class='diff-add'> },</span> <span class='diff-add'> setScrollTop: function(pos) {</span> <span class='diff-add'> if (this.vert.scrollTop != pos) this.vert.scrollTop = pos;</span> <span class='diff-add'> },</span> <span class='diff-add'> overlayHack: function() {</span> <span class='diff-add'> var w = mac && !mac_geMountainLion ? "12px" : "18px";</span> <span class='diff-add'> this.horiz.style.minHeight = this.vert.style.minWidth = w;</span> <span class='diff-add'> var self = this;</span> <span class='diff-add'> var barMouseDown = function(e) {</span> <span class='diff-add'> if (e_target(e) != self.vert && e_target(e) != self.horiz)</span> <span class='diff-add'> operation(self.cm, onMouseDown)(e);</span> <span class='diff-add'> };</span> <span class='diff-add'> on(this.vert, "mousedown", barMouseDown);</span> <span class='diff-add'> on(this.horiz, "mousedown", barMouseDown);</span> <span class='diff-add'> },</span> <span class='diff-add'> clear: function() {</span> <span class='diff-add'> var parent = this.horiz.parentNode;</span> <span class='diff-add'> parent.removeChild(this.horiz);</span> <span class='diff-add'> parent.removeChild(this.vert);</span> <span class='diff-add'> }</span> <span class='diff-add'> }, NativeScrollbars.prototype);</span> <span class='diff-add'> function NullScrollbars() {}</span> <span class='diff-add'> NullScrollbars.prototype = copyObj({</span> <span class='diff-add'> update: function() { return {bottom: 0, right: 0}; },</span> <span class='diff-add'> setScrollLeft: function() {},</span> <span class='diff-add'> setScrollTop: function() {},</span> <span class='diff-add'> clear: function() {}</span> <span class='diff-add'> }, NullScrollbars.prototype);</span> <span class='diff-add'> CodeMirror.scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars};</span> <span class='diff-add'> function initScrollbars(cm) {</span> <span class='diff-add'> if (cm.display.scrollbars) {</span> <span class='diff-add'> cm.display.scrollbars.clear();</span> <span class='diff-add'> if (cm.display.scrollbars.addClass)</span> <span class='diff-add'> rmClass(cm.display.wrapper, cm.display.scrollbars.addClass);</span> <span class='diff-add'> }</span> <span class='diff-add'> cm.display.scrollbars = new CodeMirror.scrollbarModel[cm.options.scrollbarStyle](function(node) {</span> <span class='diff-add'> cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);</span> <span class='diff-add'> on(node, "mousedown", function() {</span> <span class='diff-add'> if (cm.state.focused) setTimeout(bind(focusInput, cm), 0);</span> <span class='diff-add'> });</span> <span class='diff-add'> node.setAttribute("not-content", "true");</span> <span class='diff-add'> }, function(pos, axis) {</span> <span class='diff-add'> if (axis == "horizontal") setScrollLeft(cm, pos);</span> <span class='diff-add'> else setScrollTop(cm, pos);</span> <span class='diff-add'> }, cm);</span> <span class='diff-add'> if (cm.display.scrollbars.addClass)</span> <span class='diff-add'> addClass(cm.display.wrapper, cm.display.scrollbars.addClass);</span> <span class='diff-add'> }</span> <span class='diff-add'> function updateScrollbars(cm, measure) {</span> <span class='diff-add'> if (!measure) measure = measureForScrollbars(cm);</span> <span class='diff-add'> var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;</span> <span class='diff-add'> updateScrollbarsInner(cm, measure);</span> <span class='diff-add'> for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {</span> <span class='diff-add'> if (startWidth != cm.display.barWidth && cm.options.lineWrapping)</span> <span class='diff-add'> updateHeightsInViewport(cm);</span> <span class='diff-add'> updateScrollbarsInner(cm, measureForScrollbars(cm));</span> <span class='diff-add'> startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Re-synchronize the fake scrollbars with the actual size of the</span> <span class='diff-add'> // content.</span> <span class='diff-add'> function updateScrollbarsInner(cm, measure) {</span> <span class='diff-add'> var d = cm.display;</span> <span class='diff-add'> var sizes = d.scrollbars.update(measure);</span> <span class='diff-add'> d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px";</span> <span class='diff-add'> d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px";</span> <span class='diff-add'> if (sizes.right && sizes.bottom) {</span> <span class='diff-add'> d.scrollbarFiller.style.display = "block";</span> <span class='diff-add'> d.scrollbarFiller.style.height = sizes.bottom + "px";</span> <span class='diff-add'> d.scrollbarFiller.style.width = sizes.right + "px";</span> <span class='diff-add'> } else d.scrollbarFiller.style.display = "";</span> <span class='diff-add'> if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {</span> <span class='diff-add'> d.gutterFiller.style.display = "block";</span> <span class='diff-add'> d.gutterFiller.style.height = sizes.bottom + "px";</span> <span class='diff-add'> d.gutterFiller.style.width = measure.gutterWidth + "px";</span> <span class='diff-add'> } else d.gutterFiller.style.display = "";</span> <span class='diff-add'> }</span> <span class='diff-add'> // Compute the lines that are visible in a given viewport (defaults</span> <span class='diff-add'> // the the current scroll position). viewport may contain top,</span> <span class='diff-add'> // height, and ensure (see op.scrollToPos) properties.</span> <span class='diff-add'> function visibleLines(display, doc, viewport) {</span> <span class='diff-add'> var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;</span> <span class='diff-add'> top = Math.floor(top - paddingTop(display));</span> <span class='diff-add'> var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;</span> <span class='diff-add'> var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);</span> <span class='diff-add'> // Ensure is a {from: {line, ch}, to: {line, ch}} object, and</span> <span class='diff-add'> // forces those lines into the viewport (if possible).</span> <span class='diff-add'> if (viewport && viewport.ensure) {</span> <span class='diff-add'> var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;</span> <span class='diff-add'> if (ensureFrom < from) {</span> <span class='diff-add'> from = ensureFrom;</span> <span class='diff-add'> to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);</span> <span class='diff-add'> } else if (Math.min(ensureTo, doc.lastLine()) >= to) {</span> <span class='diff-add'> from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);</span> <span class='diff-add'> to = ensureTo;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return {from: from, to: Math.max(to, from + 1)};</span> <span class='diff-add'> }</span> <span class='diff-add'> // LINE NUMBERS</span> <span class='diff-add'> // Re-align line numbers and gutter marks to compensate for</span> <span class='diff-add'> // horizontal scrolling.</span> <span class='diff-add'> function alignHorizontally(cm) {</span> <span class='diff-add'> var display = cm.display, view = display.view;</span> <span class='diff-add'> if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;</span> <span class='diff-add'> var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;</span> <span class='diff-add'> var gutterW = display.gutters.offsetWidth, left = comp + "px";</span> <span class='diff-add'> for (var i = 0; i < view.length; i++) if (!view[i].hidden) {</span> <span class='diff-add'> if (cm.options.fixedGutter && view[i].gutter)</span> <span class='diff-add'> view[i].gutter.style.left = left;</span> <span class='diff-add'> var align = view[i].alignable;</span> <span class='diff-add'> if (align) for (var j = 0; j < align.length; j++)</span> <span class='diff-add'> align[j].style.left = left;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (cm.options.fixedGutter)</span> <span class='diff-add'> display.gutters.style.left = (comp + gutterW) + "px";</span> <span class='diff-add'> }</span> <span class='diff-add'> // Used to ensure that the line number gutter is still the right</span> <span class='diff-add'> // size for the current document size. Returns true when an update</span> <span class='diff-add'> // is needed.</span> <span class='diff-add'> function maybeUpdateLineNumberWidth(cm) {</span> <span class='diff-add'> if (!cm.options.lineNumbers) return false;</span> <span class='diff-add'> var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;</span> <span class='diff-add'> if (last.length != display.lineNumChars) {</span> <span class='diff-add'> var test = display.measure.appendChild(elt("div", [elt("div", last)],</span> <span class='diff-add'> "CodeMirror-linenumber CodeMirror-gutter-elt"));</span> <span class='diff-add'> var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;</span> <span class='diff-add'> display.lineGutter.style.width = "";</span> <span class='diff-add'> display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding);</span> <span class='diff-add'> display.lineNumWidth = display.lineNumInnerWidth + padding;</span> <span class='diff-add'> display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;</span> <span class='diff-add'> display.lineGutter.style.width = display.lineNumWidth + "px";</span> <span class='diff-add'> updateGutterSpace(cm);</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> function lineNumberFor(options, i) {</span> <span class='diff-add'> return String(options.lineNumberFormatter(i + options.firstLineNumber));</span> <span class='diff-add'> }</span> <span class='diff-add'> // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,</span> <span class='diff-add'> // but using getBoundingClientRect to get a sub-pixel-accurate</span> <span class='diff-add'> // result.</span> <span class='diff-add'> function compensateForHScroll(display) {</span> <span class='diff-add'> return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left;</span> <span class='diff-add'> }</span> <span class='diff-add'> // DISPLAY DRAWING</span> <span class='diff-add'> function DisplayUpdate(cm, viewport, force) {</span> <span class='diff-add'> var display = cm.display;</span> <span class='diff-add'> this.viewport = viewport;</span> <span class='diff-add'> // Store some values that we'll need later (but don't want to force a relayout for)</span> <span class='diff-add'> this.visible = visibleLines(display, cm.doc, viewport);</span> <span class='diff-add'> this.editorIsHidden = !display.wrapper.offsetWidth;</span> <span class='diff-add'> this.wrapperHeight = display.wrapper.clientHeight;</span> <span class='diff-add'> this.wrapperWidth = display.wrapper.clientWidth;</span> <span class='diff-add'> this.oldDisplayWidth = displayWidth(cm);</span> <span class='diff-add'> this.force = force;</span> <span class='diff-add'> this.dims = getDimensions(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> function maybeClipScrollbars(cm) {</span> <span class='diff-add'> var display = cm.display;</span> <span class='diff-add'> if (!display.scrollbarsClipped && display.scroller.offsetWidth) {</span> <span class='diff-add'> display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;</span> <span class='diff-add'> display.heightForcer.style.height = scrollGap(cm) + "px";</span> <span class='diff-add'> display.sizer.style.marginBottom = -display.nativeBarWidth + "px";</span> <span class='diff-add'> display.sizer.style.borderRightWidth = scrollGap(cm) + "px";</span> <span class='diff-add'> display.scrollbarsClipped = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Does the actual updating of the line display. Bails out</span> <span class='diff-add'> // (returning false) when there is nothing to be done and forced is</span> <span class='diff-add'> // false.</span> <span class='diff-add'> function updateDisplayIfNeeded(cm, update) {</span> <span class='diff-add'> var display = cm.display, doc = cm.doc;</span> <span class='diff-add'> if (update.editorIsHidden) {</span> <span class='diff-add'> resetView(cm);</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Bail out if the visible area is already rendered and nothing changed.</span> <span class='diff-add'> if (!update.force &&</span> <span class='diff-add'> update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&</span> <span class='diff-add'> (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&</span> <span class='diff-add'> display.renderedView == display.view && countDirtyView(cm) == 0)</span> <span class='diff-add'> return false;</span> <span class='diff-add'> if (maybeUpdateLineNumberWidth(cm)) {</span> <span class='diff-add'> resetView(cm);</span> <span class='diff-add'> update.dims = getDimensions(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Compute a suitable new viewport (from & to)</span> <span class='diff-add'> var end = doc.first + doc.size;</span> <span class='diff-add'> var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);</span> <span class='diff-add'> var to = Math.min(end, update.visible.to + cm.options.viewportMargin);</span> <span class='diff-add'> if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom);</span> <span class='diff-add'> if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo);</span> <span class='diff-add'> if (sawCollapsedSpans) {</span> <span class='diff-add'> from = visualLineNo(cm.doc, from);</span> <span class='diff-add'> to = visualLineEndNo(cm.doc, to);</span> <span class='diff-add'> }</span> <span class='diff-add'> var different = from != display.viewFrom || to != display.viewTo ||</span> <span class='diff-add'> display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;</span> <span class='diff-add'> adjustView(cm, from, to);</span> <span class='diff-add'> display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));</span> <span class='diff-add'> // Position the mover div to align with the current scroll position</span> <span class='diff-add'> cm.display.mover.style.top = display.viewOffset + "px";</span> <span class='diff-add'> var toUpdate = countDirtyView(cm);</span> <span class='diff-add'> if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&</span> <span class='diff-add'> (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))</span> <span class='diff-add'> return false;</span> <span class='diff-add'> // For big changes, we hide the enclosing element during the</span> <span class='diff-add'> // update, since that speeds up the operations on most browsers.</span> <span class='diff-add'> var focused = activeElt();</span> <span class='diff-add'> if (toUpdate > 4) display.lineDiv.style.display = "none";</span> <span class='diff-add'> patchDisplay(cm, display.updateLineNumbers, update.dims);</span> <span class='diff-add'> if (toUpdate > 4) display.lineDiv.style.display = "";</span> <span class='diff-add'> display.renderedView = display.view;</span> <span class='diff-add'> // There might have been a widget with a focused element that got</span> <span class='diff-add'> // hidden or updated, if so re-focus it.</span> <span class='diff-add'> if (focused && activeElt() != focused && focused.offsetHeight) focused.focus();</span> <span class='diff-add'> // Prevent selection and cursors from interfering with the scroll</span> <span class='diff-add'> // width and height.</span> <span class='diff-add'> removeChildren(display.cursorDiv);</span> <span class='diff-add'> removeChildren(display.selectionDiv);</span> <span class='diff-add'> display.gutters.style.height = 0;</span> <span class='diff-add'> if (different) {</span> <span class='diff-add'> display.lastWrapHeight = update.wrapperHeight;</span> <span class='diff-add'> display.lastWrapWidth = update.wrapperWidth;</span> <span class='diff-add'> startWorker(cm, 400);</span> <span class='diff-add'> }</span> <span class='diff-add'> display.updateLineNumbers = null;</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> function postUpdateDisplay(cm, update) {</span> <span class='diff-add'> var force = update.force, viewport = update.viewport;</span> <span class='diff-add'> for (var first = true;; first = false) {</span> <span class='diff-add'> if (first && cm.options.lineWrapping && update.oldDisplayWidth != displayWidth(cm)) {</span> <span class='diff-add'> force = true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> force = false;</span> <span class='diff-add'> // Clip forced viewport to actual scrollable area.</span> <span class='diff-add'> if (viewport && viewport.top != null)</span> <span class='diff-add'> viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)};</span> <span class='diff-add'> // Updated line heights might result in the drawn area not</span> <span class='diff-add'> // actually covering the viewport. Keep looping until it does.</span> <span class='diff-add'> update.visible = visibleLines(cm.display, cm.doc, viewport);</span> <span class='diff-add'> if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!updateDisplayIfNeeded(cm, update)) break;</span> <span class='diff-add'> updateHeightsInViewport(cm);</span> <span class='diff-add'> var barMeasure = measureForScrollbars(cm);</span> <span class='diff-add'> updateSelection(cm);</span> <span class='diff-add'> setDocumentHeight(cm, barMeasure);</span> <span class='diff-add'> updateScrollbars(cm, barMeasure);</span> <span class='diff-add'> }</span> <span class='diff-add'> signalLater(cm, "update", cm);</span> <span class='diff-add'> if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {</span> <span class='diff-add'> signalLater(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo);</span> <span class='diff-add'> cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function updateDisplaySimple(cm, viewport) {</span> <span class='diff-add'> var update = new DisplayUpdate(cm, viewport);</span> <span class='diff-add'> if (updateDisplayIfNeeded(cm, update)) {</span> <span class='diff-add'> updateHeightsInViewport(cm);</span> <span class='diff-add'> postUpdateDisplay(cm, update);</span> <span class='diff-add'> var barMeasure = measureForScrollbars(cm);</span> <span class='diff-add'> updateSelection(cm);</span> <span class='diff-add'> setDocumentHeight(cm, barMeasure);</span> <span class='diff-add'> updateScrollbars(cm, barMeasure);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function setDocumentHeight(cm, measure) {</span> <span class='diff-add'> cm.display.sizer.style.minHeight = measure.docHeight + "px";</span> <span class='diff-add'> var total = measure.docHeight + cm.display.barHeight;</span> <span class='diff-add'> cm.display.heightForcer.style.top = total + "px";</span> <span class='diff-add'> cm.display.gutters.style.height = Math.max(total + scrollGap(cm), measure.clientHeight) + "px";</span> <span class='diff-add'> }</span> <span class='diff-add'> // Read the actual heights of the rendered lines, and update their</span> <span class='diff-add'> // stored heights to match.</span> <span class='diff-add'> function updateHeightsInViewport(cm) {</span> <span class='diff-add'> var display = cm.display;</span> <span class='diff-add'> var prevBottom = display.lineDiv.offsetTop;</span> <span class='diff-add'> for (var i = 0; i < display.view.length; i++) {</span> <span class='diff-add'> var cur = display.view[i], height;</span> <span class='diff-add'> if (cur.hidden) continue;</span> <span class='diff-add'> if (ie && ie_version < 8) {</span> <span class='diff-add'> var bot = cur.node.offsetTop + cur.node.offsetHeight;</span> <span class='diff-add'> height = bot - prevBottom;</span> <span class='diff-add'> prevBottom = bot;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var box = cur.node.getBoundingClientRect();</span> <span class='diff-add'> height = box.bottom - box.top;</span> <span class='diff-add'> }</span> <span class='diff-add'> var diff = cur.line.height - height;</span> <span class='diff-add'> if (height < 2) height = textHeight(display);</span> <span class='diff-add'> if (diff > .001 || diff < -.001) {</span> <span class='diff-add'> updateLineHeight(cur.line, height);</span> <span class='diff-add'> updateWidgetHeight(cur.line);</span> <span class='diff-add'> if (cur.rest) for (var j = 0; j < cur.rest.length; j++)</span> <span class='diff-add'> updateWidgetHeight(cur.rest[j]);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Read and store the height of line widgets associated with the</span> <span class='diff-add'> // given line.</span> <span class='diff-add'> function updateWidgetHeight(line) {</span> <span class='diff-add'> if (line.widgets) for (var i = 0; i < line.widgets.length; ++i)</span> <span class='diff-add'> line.widgets[i].height = line.widgets[i].node.offsetHeight;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Do a bulk-read of the DOM positions and sizes needed to draw the</span> <span class='diff-add'> // view, so that we don't interleave reading and writing to the DOM.</span> <span class='diff-add'> function getDimensions(cm) {</span> <span class='diff-add'> var d = cm.display, left = {}, width = {};</span> <span class='diff-add'> var gutterLeft = d.gutters.clientLeft;</span> <span class='diff-add'> for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {</span> <span class='diff-add'> left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft;</span> <span class='diff-add'> width[cm.options.gutters[i]] = n.clientWidth;</span> <span class='diff-add'> }</span> <span class='diff-add'> return {fixedPos: compensateForHScroll(d),</span> <span class='diff-add'> gutterTotalWidth: d.gutters.offsetWidth,</span> <span class='diff-add'> gutterLeft: left,</span> <span class='diff-add'> gutterWidth: width,</span> <span class='diff-add'> wrapperWidth: d.wrapper.clientWidth};</span> <span class='diff-add'> }</span> <span class='diff-add'> // Sync the actual display DOM structure with display.view, removing</span> <span class='diff-add'> // nodes for lines that are no longer in view, and creating the ones</span> <span class='diff-add'> // that are not there yet, and updating the ones that are out of</span> <span class='diff-add'> // date.</span> <span class='diff-add'> function patchDisplay(cm, updateNumbersFrom, dims) {</span> <span class='diff-add'> var display = cm.display, lineNumbers = cm.options.lineNumbers;</span> <span class='diff-add'> var container = display.lineDiv, cur = container.firstChild;</span> <span class='diff-add'> function rm(node) {</span> <span class='diff-add'> var next = node.nextSibling;</span> <span class='diff-add'> // Works around a throw-scroll bug in OS X Webkit</span> <span class='diff-add'> if (webkit && mac && cm.display.currentWheelTarget == node)</span> <span class='diff-add'> node.style.display = "none";</span> <span class='diff-add'> else</span> <span class='diff-add'> node.parentNode.removeChild(node);</span> <span class='diff-add'> return next;</span> <span class='diff-add'> }</span> <span class='diff-add'> var view = display.view, lineN = display.viewFrom;</span> <span class='diff-add'> // Loop over the elements in the view, syncing cur (the DOM nodes</span> <span class='diff-add'> // in display.lineDiv) with the view as we go.</span> <span class='diff-add'> for (var i = 0; i < view.length; i++) {</span> <span class='diff-add'> var lineView = view[i];</span> <span class='diff-add'> if (lineView.hidden) {</span> <span class='diff-add'> } else if (!lineView.node) { // Not drawn yet</span> <span class='diff-add'> var node = buildLineElement(cm, lineView, lineN, dims);</span> <span class='diff-add'> container.insertBefore(node, cur);</span> <span class='diff-add'> } else { // Already drawn</span> <span class='diff-add'> while (cur != lineView.node) cur = rm(cur);</span> <span class='diff-add'> var updateNumber = lineNumbers && updateNumbersFrom != null &&</span> <span class='diff-add'> updateNumbersFrom <= lineN && lineView.lineNumber;</span> <span class='diff-add'> if (lineView.changes) {</span> <span class='diff-add'> if (indexOf(lineView.changes, "gutter") > -1) updateNumber = false;</span> <span class='diff-add'> updateLineForChanges(cm, lineView, lineN, dims);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (updateNumber) {</span> <span class='diff-add'> removeChildren(lineView.lineNumber);</span> <span class='diff-add'> lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));</span> <span class='diff-add'> }</span> <span class='diff-add'> cur = lineView.node.nextSibling;</span> <span class='diff-add'> }</span> <span class='diff-add'> lineN += lineView.size;</span> <span class='diff-add'> }</span> <span class='diff-add'> while (cur) cur = rm(cur);</span> <span class='diff-add'> }</span> <span class='diff-add'> // When an aspect of a line changes, a string is added to</span> <span class='diff-add'> // lineView.changes. This updates the relevant part of the line's</span> <span class='diff-add'> // DOM structure.</span> <span class='diff-add'> function updateLineForChanges(cm, lineView, lineN, dims) {</span> <span class='diff-add'> for (var j = 0; j < lineView.changes.length; j++) {</span> <span class='diff-add'> var type = lineView.changes[j];</span> <span class='diff-add'> if (type == "text") updateLineText(cm, lineView);</span> <span class='diff-add'> else if (type == "gutter") updateLineGutter(cm, lineView, lineN, dims);</span> <span class='diff-add'> else if (type == "class") updateLineClasses(lineView);</span> <span class='diff-add'> else if (type == "widget") updateLineWidgets(lineView, dims);</span> <span class='diff-add'> }</span> <span class='diff-add'> lineView.changes = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Lines with gutter elements, widgets or a background class need to</span> <span class='diff-add'> // be wrapped, and have the extra elements added to the wrapper div</span> <span class='diff-add'> function ensureLineWrapped(lineView) {</span> <span class='diff-add'> if (lineView.node == lineView.text) {</span> <span class='diff-add'> lineView.node = elt("div", null, null, "position: relative");</span> <span class='diff-add'> if (lineView.text.parentNode)</span> <span class='diff-add'> lineView.text.parentNode.replaceChild(lineView.node, lineView.text);</span> <span class='diff-add'> lineView.node.appendChild(lineView.text);</span> <span class='diff-add'> if (ie && ie_version < 8) lineView.node.style.zIndex = 2;</span> <span class='diff-add'> }</span> <span class='diff-add'> return lineView.node;</span> <span class='diff-add'> }</span> <span class='diff-add'> function updateLineBackground(lineView) {</span> <span class='diff-add'> var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass;</span> <span class='diff-add'> if (cls) cls += " CodeMirror-linebackground";</span> <span class='diff-add'> if (lineView.background) {</span> <span class='diff-add'> if (cls) lineView.background.className = cls;</span> <span class='diff-add'> else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }</span> <span class='diff-add'> } else if (cls) {</span> <span class='diff-add'> var wrap = ensureLineWrapped(lineView);</span> <span class='diff-add'> lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Wrapper around buildLineContent which will reuse the structure</span> <span class='diff-add'> // in display.externalMeasured when possible.</span> <span class='diff-add'> function getLineContent(cm, lineView) {</span> <span class='diff-add'> var ext = cm.display.externalMeasured;</span> <span class='diff-add'> if (ext && ext.line == lineView.line) {</span> <span class='diff-add'> cm.display.externalMeasured = null;</span> <span class='diff-add'> lineView.measure = ext.measure;</span> <span class='diff-add'> return ext.built;</span> <span class='diff-add'> }</span> <span class='diff-add'> return buildLineContent(cm, lineView);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Redraw the line's text. Interacts with the background and text</span> <span class='diff-add'> // classes because the mode may output tokens that influence these</span> <span class='diff-add'> // classes.</span> <span class='diff-add'> function updateLineText(cm, lineView) {</span> <span class='diff-add'> var cls = lineView.text.className;</span> <span class='diff-add'> var built = getLineContent(cm, lineView);</span> <span class='diff-add'> if (lineView.text == lineView.node) lineView.node = built.pre;</span> <span class='diff-add'> lineView.text.parentNode.replaceChild(built.pre, lineView.text);</span> <span class='diff-add'> lineView.text = built.pre;</span> <span class='diff-add'> if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {</span> <span class='diff-add'> lineView.bgClass = built.bgClass;</span> <span class='diff-add'> lineView.textClass = built.textClass;</span> <span class='diff-add'> updateLineClasses(lineView);</span> <span class='diff-add'> } else if (cls) {</span> <span class='diff-add'> lineView.text.className = cls;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function updateLineClasses(lineView) {</span> <span class='diff-add'> updateLineBackground(lineView);</span> <span class='diff-add'> if (lineView.line.wrapClass)</span> <span class='diff-add'> ensureLineWrapped(lineView).className = lineView.line.wrapClass;</span> <span class='diff-add'> else if (lineView.node != lineView.text)</span> <span class='diff-add'> lineView.node.className = "";</span> <span class='diff-add'> var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass;</span> <span class='diff-add'> lineView.text.className = textClass || "";</span> <span class='diff-add'> }</span> <span class='diff-add'> function updateLineGutter(cm, lineView, lineN, dims) {</span> <span class='diff-add'> if (lineView.gutter) {</span> <span class='diff-add'> lineView.node.removeChild(lineView.gutter);</span> <span class='diff-add'> lineView.gutter = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> var markers = lineView.line.gutterMarkers;</span> <span class='diff-add'> if (cm.options.lineNumbers || markers) {</span> <span class='diff-add'> var wrap = ensureLineWrapped(lineView);</span> <span class='diff-add'> var gutterWrap = lineView.gutter =</span> <span class='diff-add'> wrap.insertBefore(elt("div", null, "CodeMirror-gutter-wrapper", "left: " +</span> <span class='diff-add'> (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) +</span> <span class='diff-add'> "px; width: " + dims.gutterTotalWidth + "px"),</span> <span class='diff-add'> lineView.text);</span> <span class='diff-add'> if (lineView.line.gutterClass)</span> <span class='diff-add'> gutterWrap.className += " " + lineView.line.gutterClass;</span> <span class='diff-add'> if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))</span> <span class='diff-add'> lineView.lineNumber = gutterWrap.appendChild(</span> <span class='diff-add'> elt("div", lineNumberFor(cm.options, lineN),</span> <span class='diff-add'> "CodeMirror-linenumber CodeMirror-gutter-elt",</span> <span class='diff-add'> "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: "</span> <span class='diff-add'> + cm.display.lineNumInnerWidth + "px"));</span> <span class='diff-add'> if (markers) for (var k = 0; k < cm.options.gutters.length; ++k) {</span> <span class='diff-add'> var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];</span> <span class='diff-add'> if (found)</span> <span class='diff-add'> gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " +</span> <span class='diff-add'> dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px"));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function updateLineWidgets(lineView, dims) {</span> <span class='diff-add'> if (lineView.alignable) lineView.alignable = null;</span> <span class='diff-add'> for (var node = lineView.node.firstChild, next; node; node = next) {</span> <span class='diff-add'> var next = node.nextSibling;</span> <span class='diff-add'> if (node.className == "CodeMirror-linewidget")</span> <span class='diff-add'> lineView.node.removeChild(node);</span> <span class='diff-add'> }</span> <span class='diff-add'> insertLineWidgets(lineView, dims);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Build a line's DOM representation from scratch</span> <span class='diff-add'> function buildLineElement(cm, lineView, lineN, dims) {</span> <span class='diff-add'> var built = getLineContent(cm, lineView);</span> <span class='diff-add'> lineView.text = lineView.node = built.pre;</span> <span class='diff-add'> if (built.bgClass) lineView.bgClass = built.bgClass;</span> <span class='diff-add'> if (built.textClass) lineView.textClass = built.textClass;</span> <span class='diff-add'> updateLineClasses(lineView);</span> <span class='diff-add'> updateLineGutter(cm, lineView, lineN, dims);</span> <span class='diff-add'> insertLineWidgets(lineView, dims);</span> <span class='diff-add'> return lineView.node;</span> <span class='diff-add'> }</span> <span class='diff-add'> // A lineView may contain multiple logical lines (when merged by</span> <span class='diff-add'> // collapsed spans). The widgets for all of them need to be drawn.</span> <span class='diff-add'> function insertLineWidgets(lineView, dims) {</span> <span class='diff-add'> insertLineWidgetsFor(lineView.line, lineView, dims, true);</span> <span class='diff-add'> if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)</span> <span class='diff-add'> insertLineWidgetsFor(lineView.rest[i], lineView, dims, false);</span> <span class='diff-add'> }</span> <span class='diff-add'> function insertLineWidgetsFor(line, lineView, dims, allowAbove) {</span> <span class='diff-add'> if (!line.widgets) return;</span> <span class='diff-add'> var wrap = ensureLineWrapped(lineView);</span> <span class='diff-add'> for (var i = 0, ws = line.widgets; i < ws.length; ++i) {</span> <span class='diff-add'> var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget");</span> <span class='diff-add'> if (!widget.handleMouseEvents) node.setAttribute("cm-ignore-events", "true");</span> <span class='diff-add'> positionLineWidget(widget, node, lineView, dims);</span> <span class='diff-add'> if (allowAbove && widget.above)</span> <span class='diff-add'> wrap.insertBefore(node, lineView.gutter || lineView.text);</span> <span class='diff-add'> else</span> <span class='diff-add'> wrap.appendChild(node);</span> <span class='diff-add'> signalLater(widget, "redraw");</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function positionLineWidget(widget, node, lineView, dims) {</span> <span class='diff-add'> if (widget.noHScroll) {</span> <span class='diff-add'> (lineView.alignable || (lineView.alignable = [])).push(node);</span> <span class='diff-add'> var width = dims.wrapperWidth;</span> <span class='diff-add'> node.style.left = dims.fixedPos + "px";</span> <span class='diff-add'> if (!widget.coverGutter) {</span> <span class='diff-add'> width -= dims.gutterTotalWidth;</span> <span class='diff-add'> node.style.paddingLeft = dims.gutterTotalWidth + "px";</span> <span class='diff-add'> }</span> <span class='diff-add'> node.style.width = width + "px";</span> <span class='diff-add'> }</span> <span class='diff-add'> if (widget.coverGutter) {</span> <span class='diff-add'> node.style.zIndex = 5;</span> <span class='diff-add'> node.style.position = "relative";</span> <span class='diff-add'> if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px";</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // POSITION OBJECT</span> <span class='diff-add'> // A Pos instance represents a position within the text.</span> <span class='diff-add'> var Pos = CodeMirror.Pos = function(line, ch) {</span> <span class='diff-add'> if (!(this instanceof Pos)) return new Pos(line, ch);</span> <span class='diff-add'> this.line = line; this.ch = ch;</span> <span class='diff-add'> };</span> <span class='diff-add'> // Compare two positions, return 0 if they are the same, a negative</span> <span class='diff-add'> // number when a is less, and a positive number otherwise.</span> <span class='diff-add'> var cmp = CodeMirror.cmpPos = function(a, b) { return a.line - b.line || a.ch - b.ch; };</span> <span class='diff-add'> function copyPos(x) {return Pos(x.line, x.ch);}</span> <span class='diff-add'> function maxPos(a, b) { return cmp(a, b) < 0 ? b : a; }</span> <span class='diff-add'> function minPos(a, b) { return cmp(a, b) < 0 ? a : b; }</span> <span class='diff-add'> // SELECTION / CURSOR</span> <span class='diff-add'> // Selection objects are immutable. A new one is created every time</span> <span class='diff-add'> // the selection changes. A selection is one or more non-overlapping</span> <span class='diff-add'> // (and non-touching) ranges, sorted, and an integer that indicates</span> <span class='diff-add'> // which one is the primary selection (the one that's scrolled into</span> <span class='diff-add'> // view, that getCursor returns, etc).</span> <span class='diff-add'> function Selection(ranges, primIndex) {</span> <span class='diff-add'> this.ranges = ranges;</span> <span class='diff-add'> this.primIndex = primIndex;</span> <span class='diff-add'> }</span> <span class='diff-add'> Selection.prototype = {</span> <span class='diff-add'> primary: function() { return this.ranges[this.primIndex]; },</span> <span class='diff-add'> equals: function(other) {</span> <span class='diff-add'> if (other == this) return true;</span> <span class='diff-add'> if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false;</span> <span class='diff-add'> for (var i = 0; i < this.ranges.length; i++) {</span> <span class='diff-add'> var here = this.ranges[i], there = other.ranges[i];</span> <span class='diff-add'> if (cmp(here.anchor, there.anchor) != 0 || cmp(here.head, there.head) != 0) return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> return true;</span> <span class='diff-add'> },</span> <span class='diff-add'> deepCopy: function() {</span> <span class='diff-add'> for (var out = [], i = 0; i < this.ranges.length; i++)</span> <span class='diff-add'> out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head));</span> <span class='diff-add'> return new Selection(out, this.primIndex);</span> <span class='diff-add'> },</span> <span class='diff-add'> somethingSelected: function() {</span> <span class='diff-add'> for (var i = 0; i < this.ranges.length; i++)</span> <span class='diff-add'> if (!this.ranges[i].empty()) return true;</span> <span class='diff-add'> return false;</span> <span class='diff-add'> },</span> <span class='diff-add'> contains: function(pos, end) {</span> <span class='diff-add'> if (!end) end = pos;</span> <span class='diff-add'> for (var i = 0; i < this.ranges.length; i++) {</span> <span class='diff-add'> var range = this.ranges[i];</span> <span class='diff-add'> if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)</span> <span class='diff-add'> return i;</span> <span class='diff-add'> }</span> <span class='diff-add'> return -1;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> function Range(anchor, head) {</span> <span class='diff-add'> this.anchor = anchor; this.head = head;</span> <span class='diff-add'> }</span> <span class='diff-add'> Range.prototype = {</span> <span class='diff-add'> from: function() { return minPos(this.anchor, this.head); },</span> <span class='diff-add'> to: function() { return maxPos(this.anchor, this.head); },</span> <span class='diff-add'> empty: function() {</span> <span class='diff-add'> return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // Take an unsorted, potentially overlapping set of ranges, and</span> <span class='diff-add'> // build a selection out of it. 'Consumes' ranges array (modifying</span> <span class='diff-add'> // it).</span> <span class='diff-add'> function normalizeSelection(ranges, primIndex) {</span> <span class='diff-add'> var prim = ranges[primIndex];</span> <span class='diff-add'> ranges.sort(function(a, b) { return cmp(a.from(), b.from()); });</span> <span class='diff-add'> primIndex = indexOf(ranges, prim);</span> <span class='diff-add'> for (var i = 1; i < ranges.length; i++) {</span> <span class='diff-add'> var cur = ranges[i], prev = ranges[i - 1];</span> <span class='diff-add'> if (cmp(prev.to(), cur.from()) >= 0) {</span> <span class='diff-add'> var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());</span> <span class='diff-add'> var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;</span> <span class='diff-add'> if (i <= primIndex) --primIndex;</span> <span class='diff-add'> ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return new Selection(ranges, primIndex);</span> <span class='diff-add'> }</span> <span class='diff-add'> function simpleSelection(anchor, head) {</span> <span class='diff-add'> return new Selection([new Range(anchor, head || anchor)], 0);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Most of the external API clips given positions to make sure they</span> <span class='diff-add'> // actually exist within the document.</span> <span class='diff-add'> function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));}</span> <span class='diff-add'> function clipPos(doc, pos) {</span> <span class='diff-add'> if (pos.line < doc.first) return Pos(doc.first, 0);</span> <span class='diff-add'> var last = doc.first + doc.size - 1;</span> <span class='diff-add'> if (pos.line > last) return Pos(last, getLine(doc, last).text.length);</span> <span class='diff-add'> return clipToLen(pos, getLine(doc, pos.line).text.length);</span> <span class='diff-add'> }</span> <span class='diff-add'> function clipToLen(pos, linelen) {</span> <span class='diff-add'> var ch = pos.ch;</span> <span class='diff-add'> if (ch == null || ch > linelen) return Pos(pos.line, linelen);</span> <span class='diff-add'> else if (ch < 0) return Pos(pos.line, 0);</span> <span class='diff-add'> else return pos;</span> <span class='diff-add'> }</span> <span class='diff-add'> function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;}</span> <span class='diff-add'> function clipPosArray(doc, array) {</span> <span class='diff-add'> for (var out = [], i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i]);</span> <span class='diff-add'> return out;</span> <span class='diff-add'> }</span> <span class='diff-add'> // SELECTION UPDATES</span> <span class='diff-add'> // The 'scroll' parameter given to many of these indicated whether</span> <span class='diff-add'> // the new cursor position should be scrolled into view after</span> <span class='diff-add'> // modifying the selection.</span> <span class='diff-add'> // If shift is held or the extend flag is set, extends a range to</span> <span class='diff-add'> // include a given position (and optionally a second position).</span> <span class='diff-add'> // Otherwise, simply returns the range between the given positions.</span> <span class='diff-add'> // Used for cursor motion and such.</span> <span class='diff-add'> function extendRange(doc, range, head, other) {</span> <span class='diff-add'> if (doc.cm && doc.cm.display.shift || doc.extend) {</span> <span class='diff-add'> var anchor = range.anchor;</span> <span class='diff-add'> if (other) {</span> <span class='diff-add'> var posBefore = cmp(head, anchor) < 0;</span> <span class='diff-add'> if (posBefore != (cmp(other, anchor) < 0)) {</span> <span class='diff-add'> anchor = head;</span> <span class='diff-add'> head = other;</span> <span class='diff-add'> } else if (posBefore != (cmp(head, other) < 0)) {</span> <span class='diff-add'> head = other;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return new Range(anchor, head);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return new Range(other || head, head);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Extend the primary selection range, discard the rest.</span> <span class='diff-add'> function extendSelection(doc, head, other, options) {</span> <span class='diff-add'> setSelection(doc, new Selection([extendRange(doc, doc.sel.primary(), head, other)], 0), options);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Extend all selections (pos is an array of selections with length</span> <span class='diff-add'> // equal the number of selections)</span> <span class='diff-add'> function extendSelections(doc, heads, options) {</span> <span class='diff-add'> for (var out = [], i = 0; i < doc.sel.ranges.length; i++)</span> <span class='diff-add'> out[i] = extendRange(doc, doc.sel.ranges[i], heads[i], null);</span> <span class='diff-add'> var newSel = normalizeSelection(out, doc.sel.primIndex);</span> <span class='diff-add'> setSelection(doc, newSel, options);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Updates a single range in the selection.</span> <span class='diff-add'> function replaceOneSelection(doc, i, range, options) {</span> <span class='diff-add'> var ranges = doc.sel.ranges.slice(0);</span> <span class='diff-add'> ranges[i] = range;</span> <span class='diff-add'> setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Reset the selection to a single range.</span> <span class='diff-add'> function setSimpleSelection(doc, anchor, head, options) {</span> <span class='diff-add'> setSelection(doc, simpleSelection(anchor, head), options);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Give beforeSelectionChange handlers a change to influence a</span> <span class='diff-add'> // selection update.</span> <span class='diff-add'> function filterSelectionChange(doc, sel) {</span> <span class='diff-add'> var obj = {</span> <span class='diff-add'> ranges: sel.ranges,</span> <span class='diff-add'> update: function(ranges) {</span> <span class='diff-add'> this.ranges = [];</span> <span class='diff-add'> for (var i = 0; i < ranges.length; i++)</span> <span class='diff-add'> this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),</span> <span class='diff-add'> clipPos(doc, ranges[i].head));</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> signal(doc, "beforeSelectionChange", doc, obj);</span> <span class='diff-add'> if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj);</span> <span class='diff-add'> if (obj.ranges != sel.ranges) return normalizeSelection(obj.ranges, obj.ranges.length - 1);</span> <span class='diff-add'> else return sel;</span> <span class='diff-add'> }</span> <span class='diff-add'> function setSelectionReplaceHistory(doc, sel, options) {</span> <span class='diff-add'> var done = doc.history.done, last = lst(done);</span> <span class='diff-add'> if (last && last.ranges) {</span> <span class='diff-add'> done[done.length - 1] = sel;</span> <span class='diff-add'> setSelectionNoUndo(doc, sel, options);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> setSelection(doc, sel, options);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Set a new selection.</span> <span class='diff-add'> function setSelection(doc, sel, options) {</span> <span class='diff-add'> setSelectionNoUndo(doc, sel, options);</span> <span class='diff-add'> addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);</span> <span class='diff-add'> }</span> <span class='diff-add'> function setSelectionNoUndo(doc, sel, options) {</span> <span class='diff-add'> if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange"))</span> <span class='diff-add'> sel = filterSelectionChange(doc, sel);</span> <span class='diff-add'> var bias = options && options.bias ||</span> <span class='diff-add'> (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);</span> <span class='diff-add'> setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));</span> <span class='diff-add'> if (!(options && options.scroll === false) && doc.cm)</span> <span class='diff-add'> ensureCursorVisible(doc.cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> function setSelectionInner(doc, sel) {</span> <span class='diff-add'> if (sel.equals(doc.sel)) return;</span> <span class='diff-add'> doc.sel = sel;</span> <span class='diff-add'> if (doc.cm) {</span> <span class='diff-add'> doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;</span> <span class='diff-add'> signalCursorActivity(doc.cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> signalLater(doc, "cursorActivity", doc);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Verify that the selection does not partially select any atomic</span> <span class='diff-add'> // marked ranges.</span> <span class='diff-add'> function reCheckSelection(doc) {</span> <span class='diff-add'> setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false), sel_dontScroll);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Return a selection that does not partially select any atomic</span> <span class='diff-add'> // ranges.</span> <span class='diff-add'> function skipAtomicInSelection(doc, sel, bias, mayClear) {</span> <span class='diff-add'> var out;</span> <span class='diff-add'> for (var i = 0; i < sel.ranges.length; i++) {</span> <span class='diff-add'> var range = sel.ranges[i];</span> <span class='diff-add'> var newAnchor = skipAtomic(doc, range.anchor, bias, mayClear);</span> <span class='diff-add'> var newHead = skipAtomic(doc, range.head, bias, mayClear);</span> <span class='diff-add'> if (out || newAnchor != range.anchor || newHead != range.head) {</span> <span class='diff-add'> if (!out) out = sel.ranges.slice(0, i);</span> <span class='diff-add'> out[i] = new Range(newAnchor, newHead);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return out ? normalizeSelection(out, sel.primIndex) : sel;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Ensure a given position is not inside an atomic range.</span> <span class='diff-add'> function skipAtomic(doc, pos, bias, mayClear) {</span> <span class='diff-add'> var flipped = false, curPos = pos;</span> <span class='diff-add'> var dir = bias || 1;</span> <span class='diff-add'> doc.cantEdit = false;</span> <span class='diff-add'> search: for (;;) {</span> <span class='diff-add'> var line = getLine(doc, curPos.line);</span> <span class='diff-add'> if (line.markedSpans) {</span> <span class='diff-add'> for (var i = 0; i < line.markedSpans.length; ++i) {</span> <span class='diff-add'> var sp = line.markedSpans[i], m = sp.marker;</span> <span class='diff-add'> if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) &&</span> <span class='diff-add'> (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) {</span> <span class='diff-add'> if (mayClear) {</span> <span class='diff-add'> signal(m, "beforeCursorEnter");</span> <span class='diff-add'> if (m.explicitlyCleared) {</span> <span class='diff-add'> if (!line.markedSpans) break;</span> <span class='diff-add'> else {--i; continue;}</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!m.atomic) continue;</span> <span class='diff-add'> var newPos = m.find(dir < 0 ? -1 : 1);</span> <span class='diff-add'> if (cmp(newPos, curPos) == 0) {</span> <span class='diff-add'> newPos.ch += dir;</span> <span class='diff-add'> if (newPos.ch < 0) {</span> <span class='diff-add'> if (newPos.line > doc.first) newPos = clipPos(doc, Pos(newPos.line - 1));</span> <span class='diff-add'> else newPos = null;</span> <span class='diff-add'> } else if (newPos.ch > line.text.length) {</span> <span class='diff-add'> if (newPos.line < doc.first + doc.size - 1) newPos = Pos(newPos.line + 1, 0);</span> <span class='diff-add'> else newPos = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!newPos) {</span> <span class='diff-add'> if (flipped) {</span> <span class='diff-add'> // Driven in a corner -- no valid cursor position found at all</span> <span class='diff-add'> // -- try again *with* clearing, if we didn't already</span> <span class='diff-add'> if (!mayClear) return skipAtomic(doc, pos, bias, true);</span> <span class='diff-add'> // Otherwise, turn off editing until further notice, and return the start of the doc</span> <span class='diff-add'> doc.cantEdit = true;</span> <span class='diff-add'> return Pos(doc.first, 0);</span> <span class='diff-add'> }</span> <span class='diff-add'> flipped = true; newPos = pos; dir = -dir;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> curPos = newPos;</span> <span class='diff-add'> continue search;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return curPos;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // SELECTION DRAWING</span> <span class='diff-add'> // Redraw the selection and/or cursor</span> <span class='diff-add'> function drawSelection(cm) {</span> <span class='diff-add'> var display = cm.display, doc = cm.doc, result = {};</span> <span class='diff-add'> var curFragment = result.cursors = document.createDocumentFragment();</span> <span class='diff-add'> var selFragment = result.selection = document.createDocumentFragment();</span> <span class='diff-add'> for (var i = 0; i < doc.sel.ranges.length; i++) {</span> <span class='diff-add'> var range = doc.sel.ranges[i];</span> <span class='diff-add'> var collapsed = range.empty();</span> <span class='diff-add'> if (collapsed || cm.options.showCursorWhenSelecting)</span> <span class='diff-add'> drawSelectionCursor(cm, range, curFragment);</span> <span class='diff-add'> if (!collapsed)</span> <span class='diff-add'> drawSelectionRange(cm, range, selFragment);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Move the hidden textarea near the cursor to prevent scrolling artifacts</span> <span class='diff-add'> if (cm.options.moveInputWithCursor) {</span> <span class='diff-add'> var headPos = cursorCoords(cm, doc.sel.primary().head, "div");</span> <span class='diff-add'> var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();</span> <span class='diff-add'> result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,</span> <span class='diff-add'> headPos.top + lineOff.top - wrapOff.top));</span> <span class='diff-add'> result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,</span> <span class='diff-add'> headPos.left + lineOff.left - wrapOff.left));</span> <span class='diff-add'> }</span> <span class='diff-add'> return result;</span> <span class='diff-add'> }</span> <span class='diff-add'> function showSelection(cm, drawn) {</span> <span class='diff-add'> removeChildrenAndAdd(cm.display.cursorDiv, drawn.cursors);</span> <span class='diff-add'> removeChildrenAndAdd(cm.display.selectionDiv, drawn.selection);</span> <span class='diff-add'> if (drawn.teTop != null) {</span> <span class='diff-add'> cm.display.inputDiv.style.top = drawn.teTop + "px";</span> <span class='diff-add'> cm.display.inputDiv.style.left = drawn.teLeft + "px";</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function updateSelection(cm) {</span> <span class='diff-add'> showSelection(cm, drawSelection(cm));</span> <span class='diff-add'> }</span> <span class='diff-add'> // Draws a cursor for the given range</span> <span class='diff-add'> function drawSelectionCursor(cm, range, output) {</span> <span class='diff-add'> var pos = cursorCoords(cm, range.head, "div", null, null, !cm.options.singleCursorHeightPerLine);</span> <span class='diff-add'> var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor"));</span> <span class='diff-add'> cursor.style.left = pos.left + "px";</span> <span class='diff-add'> cursor.style.top = pos.top + "px";</span> <span class='diff-add'> cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";</span> <span class='diff-add'> if (pos.other) {</span> <span class='diff-add'> // Secondary cursor, shown when on a 'jump' in bi-directional text</span> <span class='diff-add'> var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"));</span> <span class='diff-add'> otherCursor.style.display = "";</span> <span class='diff-add'> otherCursor.style.left = pos.other.left + "px";</span> <span class='diff-add'> otherCursor.style.top = pos.other.top + "px";</span> <span class='diff-add'> otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Draws the given range as a highlighted selection</span> <span class='diff-add'> function drawSelectionRange(cm, range, output) {</span> <span class='diff-add'> var display = cm.display, doc = cm.doc;</span> <span class='diff-add'> var fragment = document.createDocumentFragment();</span> <span class='diff-add'> var padding = paddingH(cm.display), leftSide = padding.left;</span> <span class='diff-add'> var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;</span> <span class='diff-add'> function add(left, top, width, bottom) {</span> <span class='diff-add'> if (top < 0) top = 0;</span> <span class='diff-add'> top = Math.round(top);</span> <span class='diff-add'> bottom = Math.round(bottom);</span> <span class='diff-add'> fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +</span> <span class='diff-add'> "px; top: " + top + "px; width: " + (width == null ? rightSide - left : width) +</span> <span class='diff-add'> "px; height: " + (bottom - top) + "px"));</span> <span class='diff-add'> }</span> <span class='diff-add'> function drawForLine(line, fromArg, toArg) {</span> <span class='diff-add'> var lineObj = getLine(doc, line);</span> <span class='diff-add'> var lineLen = lineObj.text.length;</span> <span class='diff-add'> var start, end;</span> <span class='diff-add'> function coords(ch, bias) {</span> <span class='diff-add'> return charCoords(cm, Pos(line, ch), "div", lineObj, bias);</span> <span class='diff-add'> }</span> <span class='diff-add'> iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {</span> <span class='diff-add'> var leftPos = coords(from, "left"), rightPos, left, right;</span> <span class='diff-add'> if (from == to) {</span> <span class='diff-add'> rightPos = leftPos;</span> <span class='diff-add'> left = right = leftPos.left;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> rightPos = coords(to - 1, "right");</span> <span class='diff-add'> if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }</span> <span class='diff-add'> left = leftPos.left;</span> <span class='diff-add'> right = rightPos.right;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (fromArg == null && from == 0) left = leftSide;</span> <span class='diff-add'> if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part</span> <span class='diff-add'> add(left, leftPos.top, null, leftPos.bottom);</span> <span class='diff-add'> left = leftSide;</span> <span class='diff-add'> if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (toArg == null && to == lineLen) right = rightSide;</span> <span class='diff-add'> if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)</span> <span class='diff-add'> start = leftPos;</span> <span class='diff-add'> if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)</span> <span class='diff-add'> end = rightPos;</span> <span class='diff-add'> if (left < leftSide + 1) left = leftSide;</span> <span class='diff-add'> add(left, rightPos.top, right - left, rightPos.bottom);</span> <span class='diff-add'> });</span> <span class='diff-add'> return {start: start, end: end};</span> <span class='diff-add'> }</span> <span class='diff-add'> var sFrom = range.from(), sTo = range.to();</span> <span class='diff-add'> if (sFrom.line == sTo.line) {</span> <span class='diff-add'> drawForLine(sFrom.line, sFrom.ch, sTo.ch);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);</span> <span class='diff-add'> var singleVLine = visualLine(fromLine) == visualLine(toLine);</span> <span class='diff-add'> var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;</span> <span class='diff-add'> var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;</span> <span class='diff-add'> if (singleVLine) {</span> <span class='diff-add'> if (leftEnd.top < rightStart.top - 2) {</span> <span class='diff-add'> add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);</span> <span class='diff-add'> add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (leftEnd.bottom < rightStart.top)</span> <span class='diff-add'> add(leftSide, leftEnd.bottom, null, rightStart.top);</span> <span class='diff-add'> }</span> <span class='diff-add'> output.appendChild(fragment);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Cursor-blinking</span> <span class='diff-add'> function restartBlink(cm) {</span> <span class='diff-add'> if (!cm.state.focused) return;</span> <span class='diff-add'> var display = cm.display;</span> <span class='diff-add'> clearInterval(display.blinker);</span> <span class='diff-add'> var on = true;</span> <span class='diff-add'> display.cursorDiv.style.visibility = "";</span> <span class='diff-add'> if (cm.options.cursorBlinkRate > 0)</span> <span class='diff-add'> display.blinker = setInterval(function() {</span> <span class='diff-add'> display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden";</span> <span class='diff-add'> }, cm.options.cursorBlinkRate);</span> <span class='diff-add'> else if (cm.options.cursorBlinkRate < 0)</span> <span class='diff-add'> display.cursorDiv.style.visibility = "hidden";</span> <span class='diff-add'> }</span> <span class='diff-add'> // HIGHLIGHT WORKER</span> <span class='diff-add'> function startWorker(cm, time) {</span> <span class='diff-add'> if (cm.doc.mode.startState && cm.doc.frontier < cm.display.viewTo)</span> <span class='diff-add'> cm.state.highlight.set(time, bind(highlightWorker, cm));</span> <span class='diff-add'> }</span> <span class='diff-add'> function highlightWorker(cm) {</span> <span class='diff-add'> var doc = cm.doc;</span> <span class='diff-add'> if (doc.frontier < doc.first) doc.frontier = doc.first;</span> <span class='diff-add'> if (doc.frontier >= cm.display.viewTo) return;</span> <span class='diff-add'> var end = +new Date + cm.options.workTime;</span> <span class='diff-add'> var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));</span> <span class='diff-add'> var changedLines = [];</span> <span class='diff-add'> doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function(line) {</span> <span class='diff-add'> if (doc.frontier >= cm.display.viewFrom) { // Visible</span> <span class='diff-add'> var oldStyles = line.styles;</span> <span class='diff-add'> var highlighted = highlightLine(cm, line, state, true);</span> <span class='diff-add'> line.styles = highlighted.styles;</span> <span class='diff-add'> var oldCls = line.styleClasses, newCls = highlighted.classes;</span> <span class='diff-add'> if (newCls) line.styleClasses = newCls;</span> <span class='diff-add'> else if (oldCls) line.styleClasses = null;</span> <span class='diff-add'> var ischange = !oldStyles || oldStyles.length != line.styles.length ||</span> <span class='diff-add'> oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);</span> <span class='diff-add'> for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];</span> <span class='diff-add'> if (ischange) changedLines.push(doc.frontier);</span> <span class='diff-add'> line.stateAfter = copyState(doc.mode, state);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> processLine(cm, line.text, state);</span> <span class='diff-add'> line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;</span> <span class='diff-add'> }</span> <span class='diff-add'> ++doc.frontier;</span> <span class='diff-add'> if (+new Date > end) {</span> <span class='diff-add'> startWorker(cm, cm.options.workDelay);</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> if (changedLines.length) runInOp(cm, function() {</span> <span class='diff-add'> for (var i = 0; i < changedLines.length; i++)</span> <span class='diff-add'> regLineChange(cm, changedLines[i], "text");</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> // Finds the line to start with when starting a parse. Tries to</span> <span class='diff-add'> // find a line with a stateAfter, so that it can start with a</span> <span class='diff-add'> // valid state. If that fails, it returns the line with the</span> <span class='diff-add'> // smallest indentation, which tends to need the least context to</span> <span class='diff-add'> // parse correctly.</span> <span class='diff-add'> function findStartLine(cm, n, precise) {</span> <span class='diff-add'> var minindent, minline, doc = cm.doc;</span> <span class='diff-add'> var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);</span> <span class='diff-add'> for (var search = n; search > lim; --search) {</span> <span class='diff-add'> if (search <= doc.first) return doc.first;</span> <span class='diff-add'> var line = getLine(doc, search - 1);</span> <span class='diff-add'> if (line.stateAfter && (!precise || search <= doc.frontier)) return search;</span> <span class='diff-add'> var indented = countColumn(line.text, null, cm.options.tabSize);</span> <span class='diff-add'> if (minline == null || minindent > indented) {</span> <span class='diff-add'> minline = search - 1;</span> <span class='diff-add'> minindent = indented;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return minline;</span> <span class='diff-add'> }</span> <span class='diff-add'> function getStateBefore(cm, n, precise) {</span> <span class='diff-add'> var doc = cm.doc, display = cm.display;</span> <span class='diff-add'> if (!doc.mode.startState) return true;</span> <span class='diff-add'> var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;</span> <span class='diff-add'> if (!state) state = startState(doc.mode);</span> <span class='diff-add'> else state = copyState(doc.mode, state);</span> <span class='diff-add'> doc.iter(pos, n, function(line) {</span> <span class='diff-add'> processLine(cm, line.text, state);</span> <span class='diff-add'> var save = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo;</span> <span class='diff-add'> line.stateAfter = save ? copyState(doc.mode, state) : null;</span> <span class='diff-add'> ++pos;</span> <span class='diff-add'> });</span> <span class='diff-add'> if (precise) doc.frontier = pos;</span> <span class='diff-add'> return state;</span> <span class='diff-add'> }</span> <span class='diff-add'> // POSITION MEASUREMENT</span> <span class='diff-add'> function paddingTop(display) {return display.lineSpace.offsetTop;}</span> <span class='diff-add'> function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}</span> <span class='diff-add'> function paddingH(display) {</span> <span class='diff-add'> if (display.cachedPaddingH) return display.cachedPaddingH;</span> <span class='diff-add'> var e = removeChildrenAndAdd(display.measure, elt("pre", "x"));</span> <span class='diff-add'> var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;</span> <span class='diff-add'> var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};</span> <span class='diff-add'> if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data;</span> <span class='diff-add'> return data;</span> <span class='diff-add'> }</span> <span class='diff-add'> function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth; }</span> <span class='diff-add'> function displayWidth(cm) {</span> <span class='diff-add'> return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth;</span> <span class='diff-add'> }</span> <span class='diff-add'> function displayHeight(cm) {</span> <span class='diff-add'> return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Ensure the lineView.wrapping.heights array is populated. This is</span> <span class='diff-add'> // an array of bottom offsets for the lines that make up a drawn</span> <span class='diff-add'> // line. When lineWrapping is on, there might be more than one</span> <span class='diff-add'> // height.</span> <span class='diff-add'> function ensureLineHeights(cm, lineView, rect) {</span> <span class='diff-add'> var wrapping = cm.options.lineWrapping;</span> <span class='diff-add'> var curWidth = wrapping && displayWidth(cm);</span> <span class='diff-add'> if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {</span> <span class='diff-add'> var heights = lineView.measure.heights = [];</span> <span class='diff-add'> if (wrapping) {</span> <span class='diff-add'> lineView.measure.width = curWidth;</span> <span class='diff-add'> var rects = lineView.text.firstChild.getClientRects();</span> <span class='diff-add'> for (var i = 0; i < rects.length - 1; i++) {</span> <span class='diff-add'> var cur = rects[i], next = rects[i + 1];</span> <span class='diff-add'> if (Math.abs(cur.bottom - next.bottom) > 2)</span> <span class='diff-add'> heights.push((cur.bottom + next.top) / 2 - rect.top);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> heights.push(rect.bottom - rect.top);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Find a line map (mapping character offsets to text nodes) and a</span> <span class='diff-add'> // measurement cache for the given line number. (A line view might</span> <span class='diff-add'> // contain multiple lines when collapsed ranges are present.)</span> <span class='diff-add'> function mapFromLineView(lineView, line, lineN) {</span> <span class='diff-add'> if (lineView.line == line)</span> <span class='diff-add'> return {map: lineView.measure.map, cache: lineView.measure.cache};</span> <span class='diff-add'> for (var i = 0; i < lineView.rest.length; i++)</span> <span class='diff-add'> if (lineView.rest[i] == line)</span> <span class='diff-add'> return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]};</span> <span class='diff-add'> for (var i = 0; i < lineView.rest.length; i++)</span> <span class='diff-add'> if (lineNo(lineView.rest[i]) > lineN)</span> <span class='diff-add'> return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true};</span> <span class='diff-add'> }</span> <span class='diff-add'> // Render a line into the hidden node display.externalMeasured. Used</span> <span class='diff-add'> // when measurement is needed for a line that's not in the viewport.</span> <span class='diff-add'> function updateExternalMeasurement(cm, line) {</span> <span class='diff-add'> line = visualLine(line);</span> <span class='diff-add'> var lineN = lineNo(line);</span> <span class='diff-add'> var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);</span> <span class='diff-add'> view.lineN = lineN;</span> <span class='diff-add'> var built = view.built = buildLineContent(cm, view);</span> <span class='diff-add'> view.text = built.pre;</span> <span class='diff-add'> removeChildrenAndAdd(cm.display.lineMeasure, built.pre);</span> <span class='diff-add'> return view;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Get a {top, bottom, left, right} box (in line-local coordinates)</span> <span class='diff-add'> // for a given character.</span> <span class='diff-add'> function measureChar(cm, line, ch, bias) {</span> <span class='diff-add'> return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Find a line view that corresponds to the given line number.</span> <span class='diff-add'> function findViewForLine(cm, lineN) {</span> <span class='diff-add'> if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)</span> <span class='diff-add'> return cm.display.view[findViewIndex(cm, lineN)];</span> <span class='diff-add'> var ext = cm.display.externalMeasured;</span> <span class='diff-add'> if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)</span> <span class='diff-add'> return ext;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Measurement can be split in two steps, the set-up work that</span> <span class='diff-add'> // applies to the whole line, and the measurement of the actual</span> <span class='diff-add'> // character. Functions like coordsChar, that need to do a lot of</span> <span class='diff-add'> // measurements in a row, can thus ensure that the set-up work is</span> <span class='diff-add'> // only done once.</span> <span class='diff-add'> function prepareMeasureForLine(cm, line) {</span> <span class='diff-add'> var lineN = lineNo(line);</span> <span class='diff-add'> var view = findViewForLine(cm, lineN);</span> <span class='diff-add'> if (view && !view.text)</span> <span class='diff-add'> view = null;</span> <span class='diff-add'> else if (view && view.changes)</span> <span class='diff-add'> updateLineForChanges(cm, view, lineN, getDimensions(cm));</span> <span class='diff-add'> if (!view)</span> <span class='diff-add'> view = updateExternalMeasurement(cm, line);</span> <span class='diff-add'> var info = mapFromLineView(view, line, lineN);</span> <span class='diff-add'> return {</span> <span class='diff-add'> line: line, view: view, rect: null,</span> <span class='diff-add'> map: info.map, cache: info.cache, before: info.before,</span> <span class='diff-add'> hasHeights: false</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> // Given a prepared measurement object, measures the position of an</span> <span class='diff-add'> // actual character (or fetches it from the cache).</span> <span class='diff-add'> function measureCharPrepared(cm, prepared, ch, bias, varHeight) {</span> <span class='diff-add'> if (prepared.before) ch = -1;</span> <span class='diff-add'> var key = ch + (bias || ""), found;</span> <span class='diff-add'> if (prepared.cache.hasOwnProperty(key)) {</span> <span class='diff-add'> found = prepared.cache[key];</span> <span class='diff-add'> } else {</span> <span class='diff-add'> if (!prepared.rect)</span> <span class='diff-add'> prepared.rect = prepared.view.text.getBoundingClientRect();</span> <span class='diff-add'> if (!prepared.hasHeights) {</span> <span class='diff-add'> ensureLineHeights(cm, prepared.view, prepared.rect);</span> <span class='diff-add'> prepared.hasHeights = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> found = measureCharInner(cm, prepared, ch, bias);</span> <span class='diff-add'> if (!found.bogus) prepared.cache[key] = found;</span> <span class='diff-add'> }</span> <span class='diff-add'> return {left: found.left, right: found.right,</span> <span class='diff-add'> top: varHeight ? found.rtop : found.top,</span> <span class='diff-add'> bottom: varHeight ? found.rbottom : found.bottom};</span> <span class='diff-add'> }</span> <span class='diff-add'> var nullRect = {left: 0, right: 0, top: 0, bottom: 0};</span> <span class='diff-add'> function measureCharInner(cm, prepared, ch, bias) {</span> <span class='diff-add'> var map = prepared.map;</span> <span class='diff-add'> var node, start, end, collapse;</span> <span class='diff-add'> // First, search the line map for the text node corresponding to,</span> <span class='diff-add'> // or closest to, the target character.</span> <span class='diff-add'> for (var i = 0; i < map.length; i += 3) {</span> <span class='diff-add'> var mStart = map[i], mEnd = map[i + 1];</span> <span class='diff-add'> if (ch < mStart) {</span> <span class='diff-add'> start = 0; end = 1;</span> <span class='diff-add'> collapse = "left";</span> <span class='diff-add'> } else if (ch < mEnd) {</span> <span class='diff-add'> start = ch - mStart;</span> <span class='diff-add'> end = start + 1;</span> <span class='diff-add'> } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {</span> <span class='diff-add'> end = mEnd - mStart;</span> <span class='diff-add'> start = end - 1;</span> <span class='diff-add'> if (ch >= mEnd) collapse = "right";</span> <span class='diff-add'> }</span> <span class='diff-add'> if (start != null) {</span> <span class='diff-add'> node = map[i + 2];</span> <span class='diff-add'> if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right"))</span> <span class='diff-add'> collapse = bias;</span> <span class='diff-add'> if (bias == "left" && start == 0)</span> <span class='diff-add'> while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {</span> <span class='diff-add'> node = map[(i -= 3) + 2];</span> <span class='diff-add'> collapse = "left";</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bias == "right" && start == mEnd - mStart)</span> <span class='diff-add'> while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {</span> <span class='diff-add'> node = map[(i += 3) + 2];</span> <span class='diff-add'> collapse = "right";</span> <span class='diff-add'> }</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> var rect;</span> <span class='diff-add'> if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.</span> <span class='diff-add'> for (var i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned</span> <span class='diff-add'> while (start && isExtendingChar(prepared.line.text.charAt(mStart + start))) --start;</span> <span class='diff-add'> while (mStart + end < mEnd && isExtendingChar(prepared.line.text.charAt(mStart + end))) ++end;</span> <span class='diff-add'> if (ie && ie_version < 9 && start == 0 && end == mEnd - mStart) {</span> <span class='diff-add'> rect = node.parentNode.getBoundingClientRect();</span> <span class='diff-add'> } else if (ie && cm.options.lineWrapping) {</span> <span class='diff-add'> var rects = range(node, start, end).getClientRects();</span> <span class='diff-add'> if (rects.length)</span> <span class='diff-add'> rect = rects[bias == "right" ? rects.length - 1 : 0];</span> <span class='diff-add'> else</span> <span class='diff-add'> rect = nullRect;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> rect = range(node, start, end).getBoundingClientRect() || nullRect;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (rect.left || rect.right || start == 0) break;</span> <span class='diff-add'> end = start;</span> <span class='diff-add'> start = start - 1;</span> <span class='diff-add'> collapse = "right";</span> <span class='diff-add'> }</span> <span class='diff-add'> if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect);</span> <span class='diff-add'> } else { // If it is a widget, simply get the box for the whole widget.</span> <span class='diff-add'> if (start > 0) collapse = bias = "right";</span> <span class='diff-add'> var rects;</span> <span class='diff-add'> if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)</span> <span class='diff-add'> rect = rects[bias == "right" ? rects.length - 1 : 0];</span> <span class='diff-add'> else</span> <span class='diff-add'> rect = node.getBoundingClientRect();</span> <span class='diff-add'> }</span> <span class='diff-add'> if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {</span> <span class='diff-add'> var rSpan = node.parentNode.getClientRects()[0];</span> <span class='diff-add'> if (rSpan)</span> <span class='diff-add'> rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom};</span> <span class='diff-add'> else</span> <span class='diff-add'> rect = nullRect;</span> <span class='diff-add'> }</span> <span class='diff-add'> var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;</span> <span class='diff-add'> var mid = (rtop + rbot) / 2;</span> <span class='diff-add'> var heights = prepared.view.measure.heights;</span> <span class='diff-add'> for (var i = 0; i < heights.length - 1; i++)</span> <span class='diff-add'> if (mid < heights[i]) break;</span> <span class='diff-add'> var top = i ? heights[i - 1] : 0, bot = heights[i];</span> <span class='diff-add'> var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left,</span> <span class='diff-add'> right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left,</span> <span class='diff-add'> top: top, bottom: bot};</span> <span class='diff-add'> if (!rect.left && !rect.right) result.bogus = true;</span> <span class='diff-add'> if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }</span> <span class='diff-add'> return result;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Work around problem with bounding client rects on ranges being</span> <span class='diff-add'> // returned incorrectly when zoomed on IE10 and below.</span> <span class='diff-add'> function maybeUpdateRectForZooming(measure, rect) {</span> <span class='diff-add'> if (!window.screen || screen.logicalXDPI == null ||</span> <span class='diff-add'> screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))</span> <span class='diff-add'> return rect;</span> <span class='diff-add'> var scaleX = screen.logicalXDPI / screen.deviceXDPI;</span> <span class='diff-add'> var scaleY = screen.logicalYDPI / screen.deviceYDPI;</span> <span class='diff-add'> return {left: rect.left * scaleX, right: rect.right * scaleX,</span> <span class='diff-add'> top: rect.top * scaleY, bottom: rect.bottom * scaleY};</span> <span class='diff-add'> }</span> <span class='diff-add'> function clearLineMeasurementCacheFor(lineView) {</span> <span class='diff-add'> if (lineView.measure) {</span> <span class='diff-add'> lineView.measure.cache = {};</span> <span class='diff-add'> lineView.measure.heights = null;</span> <span class='diff-add'> if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)</span> <span class='diff-add'> lineView.measure.caches[i] = {};</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function clearLineMeasurementCache(cm) {</span> <span class='diff-add'> cm.display.externalMeasure = null;</span> <span class='diff-add'> removeChildren(cm.display.lineMeasure);</span> <span class='diff-add'> for (var i = 0; i < cm.display.view.length; i++)</span> <span class='diff-add'> clearLineMeasurementCacheFor(cm.display.view[i]);</span> <span class='diff-add'> }</span> <span class='diff-add'> function clearCaches(cm) {</span> <span class='diff-add'> clearLineMeasurementCache(cm);</span> <span class='diff-add'> cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;</span> <span class='diff-add'> if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;</span> <span class='diff-add'> cm.display.lineNumChars = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }</span> <span class='diff-add'> function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }</span> <span class='diff-add'> // Converts a {top, bottom, left, right} box from line-local</span> <span class='diff-add'> // coordinates into another coordinate system. Context may be one of</span> <span class='diff-add'> // "line", "div" (display.lineDiv), "local"/null (editor), or "page".</span> <span class='diff-add'> function intoCoordSystem(cm, lineObj, rect, context) {</span> <span class='diff-add'> if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {</span> <span class='diff-add'> var size = widgetHeight(lineObj.widgets[i]);</span> <span class='diff-add'> rect.top += size; rect.bottom += size;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (context == "line") return rect;</span> <span class='diff-add'> if (!context) context = "local";</span> <span class='diff-add'> var yOff = heightAtLine(lineObj);</span> <span class='diff-add'> if (context == "local") yOff += paddingTop(cm.display);</span> <span class='diff-add'> else yOff -= cm.display.viewOffset;</span> <span class='diff-add'> if (context == "page" || context == "window") {</span> <span class='diff-add'> var lOff = cm.display.lineSpace.getBoundingClientRect();</span> <span class='diff-add'> yOff += lOff.top + (context == "window" ? 0 : pageScrollY());</span> <span class='diff-add'> var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());</span> <span class='diff-add'> rect.left += xOff; rect.right += xOff;</span> <span class='diff-add'> }</span> <span class='diff-add'> rect.top += yOff; rect.bottom += yOff;</span> <span class='diff-add'> return rect;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Coverts a box from "div" coords to another coordinate system.</span> <span class='diff-add'> // Context may be "window", "page", "div", or "local"/null.</span> <span class='diff-add'> function fromCoordSystem(cm, coords, context) {</span> <span class='diff-add'> if (context == "div") return coords;</span> <span class='diff-add'> var left = coords.left, top = coords.top;</span> <span class='diff-add'> // First move into "page" coordinate system</span> <span class='diff-add'> if (context == "page") {</span> <span class='diff-add'> left -= pageScrollX();</span> <span class='diff-add'> top -= pageScrollY();</span> <span class='diff-add'> } else if (context == "local" || !context) {</span> <span class='diff-add'> var localBox = cm.display.sizer.getBoundingClientRect();</span> <span class='diff-add'> left += localBox.left;</span> <span class='diff-add'> top += localBox.top;</span> <span class='diff-add'> }</span> <span class='diff-add'> var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();</span> <span class='diff-add'> return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};</span> <span class='diff-add'> }</span> <span class='diff-add'> function charCoords(cm, pos, context, lineObj, bias) {</span> <span class='diff-add'> if (!lineObj) lineObj = getLine(cm.doc, pos.line);</span> <span class='diff-add'> return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Returns a box for a given cursor position, which may have an</span> <span class='diff-add'> // 'other' property containing the position of the secondary cursor</span> <span class='diff-add'> // on a bidi boundary.</span> <span class='diff-add'> function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {</span> <span class='diff-add'> lineObj = lineObj || getLine(cm.doc, pos.line);</span> <span class='diff-add'> if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj);</span> <span class='diff-add'> function get(ch, right) {</span> <span class='diff-add'> var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight);</span> <span class='diff-add'> if (right) m.left = m.right; else m.right = m.left;</span> <span class='diff-add'> return intoCoordSystem(cm, lineObj, m, context);</span> <span class='diff-add'> }</span> <span class='diff-add'> function getBidi(ch, partPos) {</span> <span class='diff-add'> var part = order[partPos], right = part.level % 2;</span> <span class='diff-add'> if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {</span> <span class='diff-add'> part = order[--partPos];</span> <span class='diff-add'> ch = bidiRight(part) - (part.level % 2 ? 0 : 1);</span> <span class='diff-add'> right = true;</span> <span class='diff-add'> } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {</span> <span class='diff-add'> part = order[++partPos];</span> <span class='diff-add'> ch = bidiLeft(part) - part.level % 2;</span> <span class='diff-add'> right = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (right && ch == part.to && ch > part.from) return get(ch - 1);</span> <span class='diff-add'> return get(ch, right);</span> <span class='diff-add'> }</span> <span class='diff-add'> var order = getOrder(lineObj), ch = pos.ch;</span> <span class='diff-add'> if (!order) return get(ch);</span> <span class='diff-add'> var partPos = getBidiPartAt(order, ch);</span> <span class='diff-add'> var val = getBidi(ch, partPos);</span> <span class='diff-add'> if (bidiOther != null) val.other = getBidi(ch, bidiOther);</span> <span class='diff-add'> return val;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Used to cheaply estimate the coordinates for a position. Used for</span> <span class='diff-add'> // intermediate scroll updates.</span> <span class='diff-add'> function estimateCoords(cm, pos) {</span> <span class='diff-add'> var left = 0, pos = clipPos(cm.doc, pos);</span> <span class='diff-add'> if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch;</span> <span class='diff-add'> var lineObj = getLine(cm.doc, pos.line);</span> <span class='diff-add'> var top = heightAtLine(lineObj) + paddingTop(cm.display);</span> <span class='diff-add'> return {left: left, right: left, top: top, bottom: top + lineObj.height};</span> <span class='diff-add'> }</span> <span class='diff-add'> // Positions returned by coordsChar contain some extra information.</span> <span class='diff-add'> // xRel is the relative x position of the input coordinates compared</span> <span class='diff-add'> // to the found position (so xRel > 0 means the coordinates are to</span> <span class='diff-add'> // the right of the character position, for example). When outside</span> <span class='diff-add'> // is true, that means the coordinates lie outside the line's</span> <span class='diff-add'> // vertical range.</span> <span class='diff-add'> function PosWithInfo(line, ch, outside, xRel) {</span> <span class='diff-add'> var pos = Pos(line, ch);</span> <span class='diff-add'> pos.xRel = xRel;</span> <span class='diff-add'> if (outside) pos.outside = true;</span> <span class='diff-add'> return pos;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Compute the character position closest to the given coordinates.</span> <span class='diff-add'> // Input must be lineSpace-local ("div" coordinate system).</span> <span class='diff-add'> function coordsChar(cm, x, y) {</span> <span class='diff-add'> var doc = cm.doc;</span> <span class='diff-add'> y += cm.display.viewOffset;</span> <span class='diff-add'> if (y < 0) return PosWithInfo(doc.first, 0, true, -1);</span> <span class='diff-add'> var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;</span> <span class='diff-add'> if (lineN > last)</span> <span class='diff-add'> return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);</span> <span class='diff-add'> if (x < 0) x = 0;</span> <span class='diff-add'> var lineObj = getLine(doc, lineN);</span> <span class='diff-add'> for (;;) {</span> <span class='diff-add'> var found = coordsCharInner(cm, lineObj, lineN, x, y);</span> <span class='diff-add'> var merged = collapsedSpanAtEnd(lineObj);</span> <span class='diff-add'> var mergedPos = merged && merged.find(0, true);</span> <span class='diff-add'> if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))</span> <span class='diff-add'> lineN = lineNo(lineObj = mergedPos.to.line);</span> <span class='diff-add'> else</span> <span class='diff-add'> return found;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function coordsCharInner(cm, lineObj, lineNo, x, y) {</span> <span class='diff-add'> var innerOff = y - heightAtLine(lineObj);</span> <span class='diff-add'> var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;</span> <span class='diff-add'> var preparedMeasure = prepareMeasureForLine(cm, lineObj);</span> <span class='diff-add'> function getX(ch) {</span> <span class='diff-add'> var sp = cursorCoords(cm, Pos(lineNo, ch), "line", lineObj, preparedMeasure);</span> <span class='diff-add'> wrongLine = true;</span> <span class='diff-add'> if (innerOff > sp.bottom) return sp.left - adjust;</span> <span class='diff-add'> else if (innerOff < sp.top) return sp.left + adjust;</span> <span class='diff-add'> else wrongLine = false;</span> <span class='diff-add'> return sp.left;</span> <span class='diff-add'> }</span> <span class='diff-add'> var bidi = getOrder(lineObj), dist = lineObj.text.length;</span> <span class='diff-add'> var from = lineLeft(lineObj), to = lineRight(lineObj);</span> <span class='diff-add'> var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;</span> <span class='diff-add'> if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);</span> <span class='diff-add'> // Do a binary search between these bounds.</span> <span class='diff-add'> for (;;) {</span> <span class='diff-add'> if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {</span> <span class='diff-add'> var ch = x < fromX || x - fromX <= toX - x ? from : to;</span> <span class='diff-add'> var xDiff = x - (ch == from ? fromX : toX);</span> <span class='diff-add'> while (isExtendingChar(lineObj.text.charAt(ch))) ++ch;</span> <span class='diff-add'> var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,</span> <span class='diff-add'> xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0);</span> <span class='diff-add'> return pos;</span> <span class='diff-add'> }</span> <span class='diff-add'> var step = Math.ceil(dist / 2), middle = from + step;</span> <span class='diff-add'> if (bidi) {</span> <span class='diff-add'> middle = from;</span> <span class='diff-add'> for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);</span> <span class='diff-add'> }</span> <span class='diff-add'> var middleX = getX(middle);</span> <span class='diff-add'> if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}</span> <span class='diff-add'> else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> var measureText;</span> <span class='diff-add'> // Compute the default text height.</span> <span class='diff-add'> function textHeight(display) {</span> <span class='diff-add'> if (display.cachedTextHeight != null) return display.cachedTextHeight;</span> <span class='diff-add'> if (measureText == null) {</span> <span class='diff-add'> measureText = elt("pre");</span> <span class='diff-add'> // Measure a bunch of lines, for browsers that compute</span> <span class='diff-add'> // fractional heights.</span> <span class='diff-add'> for (var i = 0; i < 49; ++i) {</span> <span class='diff-add'> measureText.appendChild(document.createTextNode("x"));</span> <span class='diff-add'> measureText.appendChild(elt("br"));</span> <span class='diff-add'> }</span> <span class='diff-add'> measureText.appendChild(document.createTextNode("x"));</span> <span class='diff-add'> }</span> <span class='diff-add'> removeChildrenAndAdd(display.measure, measureText);</span> <span class='diff-add'> var height = measureText.offsetHeight / 50;</span> <span class='diff-add'> if (height > 3) display.cachedTextHeight = height;</span> <span class='diff-add'> removeChildren(display.measure);</span> <span class='diff-add'> return height || 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Compute the default character width.</span> <span class='diff-add'> function charWidth(display) {</span> <span class='diff-add'> if (display.cachedCharWidth != null) return display.cachedCharWidth;</span> <span class='diff-add'> var anchor = elt("span", "xxxxxxxxxx");</span> <span class='diff-add'> var pre = elt("pre", [anchor]);</span> <span class='diff-add'> removeChildrenAndAdd(display.measure, pre);</span> <span class='diff-add'> var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;</span> <span class='diff-add'> if (width > 2) display.cachedCharWidth = width;</span> <span class='diff-add'> return width || 10;</span> <span class='diff-add'> }</span> <span class='diff-add'> // OPERATIONS</span> <span class='diff-add'> // Operations are used to wrap a series of changes to the editor</span> <span class='diff-add'> // state in such a way that each change won't have to update the</span> <span class='diff-add'> // cursor and display (which would be awkward, slow, and</span> <span class='diff-add'> // error-prone). Instead, display updates are batched and then all</span> <span class='diff-add'> // combined and executed at once.</span> <span class='diff-add'> var operationGroup = null;</span> <span class='diff-add'> var nextOpId = 0;</span> <span class='diff-add'> // Start a new operation.</span> <span class='diff-add'> function startOperation(cm) {</span> <span class='diff-add'> cm.curOp = {</span> <span class='diff-add'> cm: cm,</span> <span class='diff-add'> viewChanged: false, // Flag that indicates that lines might need to be redrawn</span> <span class='diff-add'> startHeight: cm.doc.height, // Used to detect need to update scrollbar</span> <span class='diff-add'> forceUpdate: false, // Used to force a redraw</span> <span class='diff-add'> updateInput: null, // Whether to reset the input textarea</span> <span class='diff-add'> typing: false, // Whether this reset should be careful to leave existing text (for compositing)</span> <span class='diff-add'> changeObjs: null, // Accumulated changes, for firing change events</span> <span class='diff-add'> cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on</span> <span class='diff-add'> cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already</span> <span class='diff-add'> selectionChanged: false, // Whether the selection needs to be redrawn</span> <span class='diff-add'> updateMaxLine: false, // Set when the widest line needs to be determined anew</span> <span class='diff-add'> scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet</span> <span class='diff-add'> scrollToPos: null, // Used to scroll to a specific position</span> <span class='diff-add'> id: ++nextOpId // Unique ID</span> <span class='diff-add'> };</span> <span class='diff-add'> if (operationGroup) {</span> <span class='diff-add'> operationGroup.ops.push(cm.curOp);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> cm.curOp.ownsGroup = operationGroup = {</span> <span class='diff-add'> ops: [cm.curOp],</span> <span class='diff-add'> delayedCallbacks: []</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function fireCallbacksForOps(group) {</span> <span class='diff-add'> // Calls delayed callbacks and cursorActivity handlers until no</span> <span class='diff-add'> // new ones appear</span> <span class='diff-add'> var callbacks = group.delayedCallbacks, i = 0;</span> <span class='diff-add'> do {</span> <span class='diff-add'> for (; i < callbacks.length; i++)</span> <span class='diff-add'> callbacks[i]();</span> <span class='diff-add'> for (var j = 0; j < group.ops.length; j++) {</span> <span class='diff-add'> var op = group.ops[j];</span> <span class='diff-add'> if (op.cursorActivityHandlers)</span> <span class='diff-add'> while (op.cursorActivityCalled < op.cursorActivityHandlers.length)</span> <span class='diff-add'> op.cursorActivityHandlers[op.cursorActivityCalled++](op.cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> } while (i < callbacks.length);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Finish an operation, updating the display and signalling delayed events</span> <span class='diff-add'> function endOperation(cm) {</span> <span class='diff-add'> var op = cm.curOp, group = op.ownsGroup;</span> <span class='diff-add'> if (!group) return;</span> <span class='diff-add'> try { fireCallbacksForOps(group); }</span> <span class='diff-add'> finally {</span> <span class='diff-add'> operationGroup = null;</span> <span class='diff-add'> for (var i = 0; i < group.ops.length; i++)</span> <span class='diff-add'> group.ops[i].cm.curOp = null;</span> <span class='diff-add'> endOperations(group);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // The DOM updates done when an operation finishes are batched so</span> <span class='diff-add'> // that the minimum number of relayouts are required.</span> <span class='diff-add'> function endOperations(group) {</span> <span class='diff-add'> var ops = group.ops;</span> <span class='diff-add'> for (var i = 0; i < ops.length; i++) // Read DOM</span> <span class='diff-add'> endOperation_R1(ops[i]);</span> <span class='diff-add'> for (var i = 0; i < ops.length; i++) // Write DOM (maybe)</span> <span class='diff-add'> endOperation_W1(ops[i]);</span> <span class='diff-add'> for (var i = 0; i < ops.length; i++) // Read DOM</span> <span class='diff-add'> endOperation_R2(ops[i]);</span> <span class='diff-add'> for (var i = 0; i < ops.length; i++) // Write DOM (maybe)</span> <span class='diff-add'> endOperation_W2(ops[i]);</span> <span class='diff-add'> for (var i = 0; i < ops.length; i++) // Read DOM</span> <span class='diff-add'> endOperation_finish(ops[i]);</span> <span class='diff-add'> }</span> <span class='diff-add'> function endOperation_R1(op) {</span> <span class='diff-add'> var cm = op.cm, display = cm.display;</span> <span class='diff-add'> maybeClipScrollbars(cm);</span> <span class='diff-add'> if (op.updateMaxLine) findMaxLine(cm);</span> <span class='diff-add'> op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||</span> <span class='diff-add'> op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||</span> <span class='diff-add'> op.scrollToPos.to.line >= display.viewTo) ||</span> <span class='diff-add'> display.maxLineChanged && cm.options.lineWrapping;</span> <span class='diff-add'> op.update = op.mustUpdate &&</span> <span class='diff-add'> new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);</span> <span class='diff-add'> }</span> <span class='diff-add'> function endOperation_W1(op) {</span> <span class='diff-add'> op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);</span> <span class='diff-add'> }</span> <span class='diff-add'> function endOperation_R2(op) {</span> <span class='diff-add'> var cm = op.cm, display = cm.display;</span> <span class='diff-add'> if (op.updatedDisplay) updateHeightsInViewport(cm);</span> <span class='diff-add'> op.barMeasure = measureForScrollbars(cm);</span> <span class='diff-add'> // If the max line changed since it was last measured, measure it,</span> <span class='diff-add'> // and ensure the document's width matches it.</span> <span class='diff-add'> // updateDisplay_W2 will use these properties to do the actual resizing</span> <span class='diff-add'> if (display.maxLineChanged && !cm.options.lineWrapping) {</span> <span class='diff-add'> op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;</span> <span class='diff-add'> cm.display.sizerWidth = op.adjustWidthTo;</span> <span class='diff-add'> op.barMeasure.scrollWidth =</span> <span class='diff-add'> Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);</span> <span class='diff-add'> op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));</span> <span class='diff-add'> }</span> <span class='diff-add'> if (op.updatedDisplay || op.selectionChanged)</span> <span class='diff-add'> op.newSelectionNodes = drawSelection(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> function endOperation_W2(op) {</span> <span class='diff-add'> var cm = op.cm;</span> <span class='diff-add'> if (op.adjustWidthTo != null) {</span> <span class='diff-add'> cm.display.sizer.style.minWidth = op.adjustWidthTo + "px";</span> <span class='diff-add'> if (op.maxScrollLeft < cm.doc.scrollLeft)</span> <span class='diff-add'> setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true);</span> <span class='diff-add'> cm.display.maxLineChanged = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (op.newSelectionNodes)</span> <span class='diff-add'> showSelection(cm, op.newSelectionNodes);</span> <span class='diff-add'> if (op.updatedDisplay)</span> <span class='diff-add'> setDocumentHeight(cm, op.barMeasure);</span> <span class='diff-add'> if (op.updatedDisplay || op.startHeight != cm.doc.height)</span> <span class='diff-add'> updateScrollbars(cm, op.barMeasure);</span> <span class='diff-add'> if (op.selectionChanged) restartBlink(cm);</span> <span class='diff-add'> if (cm.state.focused && op.updateInput)</span> <span class='diff-add'> resetInput(cm, op.typing);</span> <span class='diff-add'> }</span> <span class='diff-add'> function endOperation_finish(op) {</span> <span class='diff-add'> var cm = op.cm, display = cm.display, doc = cm.doc;</span> <span class='diff-add'> if (op.updatedDisplay) postUpdateDisplay(cm, op.update);</span> <span class='diff-add'> // Abort mouse wheel delta measurement, when scrolling explicitly</span> <span class='diff-add'> if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))</span> <span class='diff-add'> display.wheelStartX = display.wheelStartY = null;</span> <span class='diff-add'> // Propagate the scroll position to the actual DOM scroller</span> <span class='diff-add'> if (op.scrollTop != null && (display.scroller.scrollTop != op.scrollTop || op.forceScroll)) {</span> <span class='diff-add'> doc.scrollTop = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop));</span> <span class='diff-add'> display.scrollbars.setScrollTop(doc.scrollTop);</span> <span class='diff-add'> display.scroller.scrollTop = doc.scrollTop;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (op.scrollLeft != null && (display.scroller.scrollLeft != op.scrollLeft || op.forceScroll)) {</span> <span class='diff-add'> doc.scrollLeft = Math.max(0, Math.min(display.scroller.scrollWidth - displayWidth(cm), op.scrollLeft));</span> <span class='diff-add'> display.scrollbars.setScrollLeft(doc.scrollLeft);</span> <span class='diff-add'> display.scroller.scrollLeft = doc.scrollLeft;</span> <span class='diff-add'> alignHorizontally(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> // If we need to scroll a specific position into view, do so.</span> <span class='diff-add'> if (op.scrollToPos) {</span> <span class='diff-add'> var coords = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),</span> <span class='diff-add'> clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);</span> <span class='diff-add'> if (op.scrollToPos.isCursor && cm.state.focused) maybeScrollWindow(cm, coords);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Fire events for markers that are hidden/unidden by editing or</span> <span class='diff-add'> // undoing</span> <span class='diff-add'> var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;</span> <span class='diff-add'> if (hidden) for (var i = 0; i < hidden.length; ++i)</span> <span class='diff-add'> if (!hidden[i].lines.length) signal(hidden[i], "hide");</span> <span class='diff-add'> if (unhidden) for (var i = 0; i < unhidden.length; ++i)</span> <span class='diff-add'> if (unhidden[i].lines.length) signal(unhidden[i], "unhide");</span> <span class='diff-add'> if (display.wrapper.offsetHeight)</span> <span class='diff-add'> doc.scrollTop = cm.display.scroller.scrollTop;</span> <span class='diff-add'> // Fire change events, and delayed event handlers</span> <span class='diff-add'> if (op.changeObjs)</span> <span class='diff-add'> signal(cm, "changes", cm, op.changeObjs);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Run the given function in an operation</span> <span class='diff-add'> function runInOp(cm, f) {</span> <span class='diff-add'> if (cm.curOp) return f();</span> <span class='diff-add'> startOperation(cm);</span> <span class='diff-add'> try { return f(); }</span> <span class='diff-add'> finally { endOperation(cm); }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Wraps a function in an operation. Returns the wrapped function.</span> <span class='diff-add'> function operation(cm, f) {</span> <span class='diff-add'> return function() {</span> <span class='diff-add'> if (cm.curOp) return f.apply(cm, arguments);</span> <span class='diff-add'> startOperation(cm);</span> <span class='diff-add'> try { return f.apply(cm, arguments); }</span> <span class='diff-add'> finally { endOperation(cm); }</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> // Used to add methods to editor and doc instances, wrapping them in</span> <span class='diff-add'> // operations.</span> <span class='diff-add'> function methodOp(f) {</span> <span class='diff-add'> return function() {</span> <span class='diff-add'> if (this.curOp) return f.apply(this, arguments);</span> <span class='diff-add'> startOperation(this);</span> <span class='diff-add'> try { return f.apply(this, arguments); }</span> <span class='diff-add'> finally { endOperation(this); }</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> function docMethodOp(f) {</span> <span class='diff-add'> return function() {</span> <span class='diff-add'> var cm = this.cm;</span> <span class='diff-add'> if (!cm || cm.curOp) return f.apply(this, arguments);</span> <span class='diff-add'> startOperation(cm);</span> <span class='diff-add'> try { return f.apply(this, arguments); }</span> <span class='diff-add'> finally { endOperation(cm); }</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> // VIEW TRACKING</span> <span class='diff-add'> // These objects are used to represent the visible (currently drawn)</span> <span class='diff-add'> // part of the document. A LineView may correspond to multiple</span> <span class='diff-add'> // logical lines, if those are connected by collapsed ranges.</span> <span class='diff-add'> function LineView(doc, line, lineN) {</span> <span class='diff-add'> // The starting line</span> <span class='diff-add'> this.line = line;</span> <span class='diff-add'> // Continuing lines, if any</span> <span class='diff-add'> this.rest = visualLineContinued(line);</span> <span class='diff-add'> // Number of logical lines in this visual line</span> <span class='diff-add'> this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;</span> <span class='diff-add'> this.node = this.text = null;</span> <span class='diff-add'> this.hidden = lineIsHidden(doc, line);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Create a range of LineView objects for the given lines.</span> <span class='diff-add'> function buildViewArray(cm, from, to) {</span> <span class='diff-add'> var array = [], nextPos;</span> <span class='diff-add'> for (var pos = from; pos < to; pos = nextPos) {</span> <span class='diff-add'> var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);</span> <span class='diff-add'> nextPos = pos + view.size;</span> <span class='diff-add'> array.push(view);</span> <span class='diff-add'> }</span> <span class='diff-add'> return array;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Updates the display.view data structure for a given change to the</span> <span class='diff-add'> // document. From and to are in pre-change coordinates. Lendiff is</span> <span class='diff-add'> // the amount of lines added or subtracted by the change. This is</span> <span class='diff-add'> // used for changes that span multiple lines, or change the way</span> <span class='diff-add'> // lines are divided into visual lines. regLineChange (below)</span> <span class='diff-add'> // registers single-line changes.</span> <span class='diff-add'> function regChange(cm, from, to, lendiff) {</span> <span class='diff-add'> if (from == null) from = cm.doc.first;</span> <span class='diff-add'> if (to == null) to = cm.doc.first + cm.doc.size;</span> <span class='diff-add'> if (!lendiff) lendiff = 0;</span> <span class='diff-add'> var display = cm.display;</span> <span class='diff-add'> if (lendiff && to < display.viewTo &&</span> <span class='diff-add'> (display.updateLineNumbers == null || display.updateLineNumbers > from))</span> <span class='diff-add'> display.updateLineNumbers = from;</span> <span class='diff-add'> cm.curOp.viewChanged = true;</span> <span class='diff-add'> if (from >= display.viewTo) { // Change after</span> <span class='diff-add'> if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)</span> <span class='diff-add'> resetView(cm);</span> <span class='diff-add'> } else if (to <= display.viewFrom) { // Change before</span> <span class='diff-add'> if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {</span> <span class='diff-add'> resetView(cm);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> display.viewFrom += lendiff;</span> <span class='diff-add'> display.viewTo += lendiff;</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap</span> <span class='diff-add'> resetView(cm);</span> <span class='diff-add'> } else if (from <= display.viewFrom) { // Top overlap</span> <span class='diff-add'> var cut = viewCuttingPoint(cm, to, to + lendiff, 1);</span> <span class='diff-add'> if (cut) {</span> <span class='diff-add'> display.view = display.view.slice(cut.index);</span> <span class='diff-add'> display.viewFrom = cut.lineN;</span> <span class='diff-add'> display.viewTo += lendiff;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> resetView(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (to >= display.viewTo) { // Bottom overlap</span> <span class='diff-add'> var cut = viewCuttingPoint(cm, from, from, -1);</span> <span class='diff-add'> if (cut) {</span> <span class='diff-add'> display.view = display.view.slice(0, cut.index);</span> <span class='diff-add'> display.viewTo = cut.lineN;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> resetView(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> } else { // Gap in the middle</span> <span class='diff-add'> var cutTop = viewCuttingPoint(cm, from, from, -1);</span> <span class='diff-add'> var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);</span> <span class='diff-add'> if (cutTop && cutBot) {</span> <span class='diff-add'> display.view = display.view.slice(0, cutTop.index)</span> <span class='diff-add'> .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))</span> <span class='diff-add'> .concat(display.view.slice(cutBot.index));</span> <span class='diff-add'> display.viewTo += lendiff;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> resetView(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> var ext = display.externalMeasured;</span> <span class='diff-add'> if (ext) {</span> <span class='diff-add'> if (to < ext.lineN)</span> <span class='diff-add'> ext.lineN += lendiff;</span> <span class='diff-add'> else if (from < ext.lineN + ext.size)</span> <span class='diff-add'> display.externalMeasured = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Register a change to a single line. Type must be one of "text",</span> <span class='diff-add'> // "gutter", "class", "widget"</span> <span class='diff-add'> function regLineChange(cm, line, type) {</span> <span class='diff-add'> cm.curOp.viewChanged = true;</span> <span class='diff-add'> var display = cm.display, ext = cm.display.externalMeasured;</span> <span class='diff-add'> if (ext && line >= ext.lineN && line < ext.lineN + ext.size)</span> <span class='diff-add'> display.externalMeasured = null;</span> <span class='diff-add'> if (line < display.viewFrom || line >= display.viewTo) return;</span> <span class='diff-add'> var lineView = display.view[findViewIndex(cm, line)];</span> <span class='diff-add'> if (lineView.node == null) return;</span> <span class='diff-add'> var arr = lineView.changes || (lineView.changes = []);</span> <span class='diff-add'> if (indexOf(arr, type) == -1) arr.push(type);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Clear the view.</span> <span class='diff-add'> function resetView(cm) {</span> <span class='diff-add'> cm.display.viewFrom = cm.display.viewTo = cm.doc.first;</span> <span class='diff-add'> cm.display.view = [];</span> <span class='diff-add'> cm.display.viewOffset = 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Find the view element corresponding to a given line. Return null</span> <span class='diff-add'> // when the line isn't visible.</span> <span class='diff-add'> function findViewIndex(cm, n) {</span> <span class='diff-add'> if (n >= cm.display.viewTo) return null;</span> <span class='diff-add'> n -= cm.display.viewFrom;</span> <span class='diff-add'> if (n < 0) return null;</span> <span class='diff-add'> var view = cm.display.view;</span> <span class='diff-add'> for (var i = 0; i < view.length; i++) {</span> <span class='diff-add'> n -= view[i].size;</span> <span class='diff-add'> if (n < 0) return i;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function viewCuttingPoint(cm, oldN, newN, dir) {</span> <span class='diff-add'> var index = findViewIndex(cm, oldN), diff, view = cm.display.view;</span> <span class='diff-add'> if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)</span> <span class='diff-add'> return {index: index, lineN: newN};</span> <span class='diff-add'> for (var i = 0, n = cm.display.viewFrom; i < index; i++)</span> <span class='diff-add'> n += view[i].size;</span> <span class='diff-add'> if (n != oldN) {</span> <span class='diff-add'> if (dir > 0) {</span> <span class='diff-add'> if (index == view.length - 1) return null;</span> <span class='diff-add'> diff = (n + view[index].size) - oldN;</span> <span class='diff-add'> index++;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> diff = n - oldN;</span> <span class='diff-add'> }</span> <span class='diff-add'> oldN += diff; newN += diff;</span> <span class='diff-add'> }</span> <span class='diff-add'> while (visualLineNo(cm.doc, newN) != newN) {</span> <span class='diff-add'> if (index == (dir < 0 ? 0 : view.length - 1)) return null;</span> <span class='diff-add'> newN += dir * view[index - (dir < 0 ? 1 : 0)].size;</span> <span class='diff-add'> index += dir;</span> <span class='diff-add'> }</span> <span class='diff-add'> return {index: index, lineN: newN};</span> <span class='diff-add'> }</span> <span class='diff-add'> // Force the view to cover a given range, adding empty view element</span> <span class='diff-add'> // or clipping off existing ones as needed.</span> <span class='diff-add'> function adjustView(cm, from, to) {</span> <span class='diff-add'> var display = cm.display, view = display.view;</span> <span class='diff-add'> if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {</span> <span class='diff-add'> display.view = buildViewArray(cm, from, to);</span> <span class='diff-add'> display.viewFrom = from;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> if (display.viewFrom > from)</span> <span class='diff-add'> display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view);</span> <span class='diff-add'> else if (display.viewFrom < from)</span> <span class='diff-add'> display.view = display.view.slice(findViewIndex(cm, from));</span> <span class='diff-add'> display.viewFrom = from;</span> <span class='diff-add'> if (display.viewTo < to)</span> <span class='diff-add'> display.view = display.view.concat(buildViewArray(cm, display.viewTo, to));</span> <span class='diff-add'> else if (display.viewTo > to)</span> <span class='diff-add'> display.view = display.view.slice(0, findViewIndex(cm, to));</span> <span class='diff-add'> }</span> <span class='diff-add'> display.viewTo = to;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Count the number of lines in the view whose DOM representation is</span> <span class='diff-add'> // out of date (or nonexistent).</span> <span class='diff-add'> function countDirtyView(cm) {</span> <span class='diff-add'> var view = cm.display.view, dirty = 0;</span> <span class='diff-add'> for (var i = 0; i < view.length; i++) {</span> <span class='diff-add'> var lineView = view[i];</span> <span class='diff-add'> if (!lineView.hidden && (!lineView.node || lineView.changes)) ++dirty;</span> <span class='diff-add'> }</span> <span class='diff-add'> return dirty;</span> <span class='diff-add'> }</span> <span class='diff-add'> // INPUT HANDLING</span> <span class='diff-add'> // Poll for input changes, using the normal rate of polling. This</span> <span class='diff-add'> // runs as long as the editor is focused.</span> <span class='diff-add'> function slowPoll(cm) {</span> <span class='diff-add'> if (cm.display.pollingFast) return;</span> <span class='diff-add'> cm.display.poll.set(cm.options.pollInterval, function() {</span> <span class='diff-add'> readInput(cm);</span> <span class='diff-add'> if (cm.state.focused) slowPoll(cm);</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> // When an event has just come in that is likely to add or change</span> <span class='diff-add'> // something in the input textarea, we poll faster, to ensure that</span> <span class='diff-add'> // the change appears on the screen quickly.</span> <span class='diff-add'> function fastPoll(cm) {</span> <span class='diff-add'> var missed = false;</span> <span class='diff-add'> cm.display.pollingFast = true;</span> <span class='diff-add'> function p() {</span> <span class='diff-add'> var changed = readInput(cm);</span> <span class='diff-add'> if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);}</span> <span class='diff-add'> else {cm.display.pollingFast = false; slowPoll(cm);}</span> <span class='diff-add'> }</span> <span class='diff-add'> cm.display.poll.set(20, p);</span> <span class='diff-add'> }</span> <span class='diff-add'> // This will be set to an array of strings when copying, so that,</span> <span class='diff-add'> // when pasting, we know what kind of selections the copied text</span> <span class='diff-add'> // was made out of.</span> <span class='diff-add'> var lastCopied = null;</span> <span class='diff-add'> // Read input from the textarea, and update the document to match.</span> <span class='diff-add'> // When something is selected, it is present in the textarea, and</span> <span class='diff-add'> // selected (unless it is huge, in which case a placeholder is</span> <span class='diff-add'> // used). When nothing is selected, the cursor sits after previously</span> <span class='diff-add'> // seen text (can be empty), which is stored in prevInput (we must</span> <span class='diff-add'> // not reset the textarea when typing, because that breaks IME).</span> <span class='diff-add'> function readInput(cm) {</span> <span class='diff-add'> var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc;</span> <span class='diff-add'> // Since this is called a *lot*, try to bail out as cheaply as</span> <span class='diff-add'> // possible when it is clear that nothing happened. hasSelection</span> <span class='diff-add'> // will be the case when there is a lot of text in the textarea,</span> <span class='diff-add'> // in which case reading its value would be expensive.</span> <span class='diff-add'> if (!cm.state.focused || (hasSelection(input) && !prevInput) || isReadOnly(cm) || cm.options.disableInput || cm.state.keySeq)</span> <span class='diff-add'> return false;</span> <span class='diff-add'> // See paste handler for more on the fakedLastChar kludge</span> <span class='diff-add'> if (cm.state.pasteIncoming && cm.state.fakedLastChar) {</span> <span class='diff-add'> input.value = input.value.substring(0, input.value.length - 1);</span> <span class='diff-add'> cm.state.fakedLastChar = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> var text = input.value;</span> <span class='diff-add'> // If nothing changed, bail.</span> <span class='diff-add'> if (text == prevInput && !cm.somethingSelected()) return false;</span> <span class='diff-add'> // Work around nonsensical selection resetting in IE9/10, and</span> <span class='diff-add'> // inexplicable appearance of private area unicode characters on</span> <span class='diff-add'> // some key combos in Mac (#2689).</span> <span class='diff-add'> if (ie && ie_version >= 9 && cm.display.inputHasSelection === text ||</span> <span class='diff-add'> mac && /[\uf700-\uf7ff]/.test(text)) {</span> <span class='diff-add'> resetInput(cm);</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> var withOp = !cm.curOp;</span> <span class='diff-add'> if (withOp) startOperation(cm);</span> <span class='diff-add'> cm.display.shift = false;</span> <span class='diff-add'> if (text.charCodeAt(0) == 0x200b && doc.sel == cm.display.selForContextMenu && !prevInput)</span> <span class='diff-add'> prevInput = "\u200b";</span> <span class='diff-add'> // Find the part of the input that is actually new</span> <span class='diff-add'> var same = 0, l = Math.min(prevInput.length, text.length);</span> <span class='diff-add'> while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;</span> <span class='diff-add'> var inserted = text.slice(same), textLines = splitLines(inserted);</span> <span class='diff-add'> // When pasing N lines into N selections, insert one line per selection</span> <span class='diff-add'> var multiPaste = null;</span> <span class='diff-add'> if (cm.state.pasteIncoming && doc.sel.ranges.length > 1) {</span> <span class='diff-add'> if (lastCopied && lastCopied.join("\n") == inserted)</span> <span class='diff-add'> multiPaste = doc.sel.ranges.length % lastCopied.length == 0 && map(lastCopied, splitLines);</span> <span class='diff-add'> else if (textLines.length == doc.sel.ranges.length)</span> <span class='diff-add'> multiPaste = map(textLines, function(l) { return [l]; });</span> <span class='diff-add'> }</span> <span class='diff-add'> // Normal behavior is to insert the new text into every selection</span> <span class='diff-add'> for (var i = doc.sel.ranges.length - 1; i >= 0; i--) {</span> <span class='diff-add'> var range = doc.sel.ranges[i];</span> <span class='diff-add'> var from = range.from(), to = range.to();</span> <span class='diff-add'> // Handle deletion</span> <span class='diff-add'> if (same < prevInput.length)</span> <span class='diff-add'> from = Pos(from.line, from.ch - (prevInput.length - same));</span> <span class='diff-add'> // Handle overwrite</span> <span class='diff-add'> else if (cm.state.overwrite && range.empty() && !cm.state.pasteIncoming)</span> <span class='diff-add'> to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length));</span> <span class='diff-add'> var updateInput = cm.curOp.updateInput;</span> <span class='diff-add'> var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines,</span> <span class='diff-add'> origin: cm.state.pasteIncoming ? "paste" : cm.state.cutIncoming ? "cut" : "+input"};</span> <span class='diff-add'> makeChange(cm.doc, changeEvent);</span> <span class='diff-add'> signalLater(cm, "inputRead", cm, changeEvent);</span> <span class='diff-add'> // When an 'electric' character is inserted, immediately trigger a reindent</span> <span class='diff-add'> if (inserted && !cm.state.pasteIncoming && cm.options.electricChars &&</span> <span class='diff-add'> cm.options.smartIndent && range.head.ch < 100 &&</span> <span class='diff-add'> (!i || doc.sel.ranges[i - 1].head.line != range.head.line)) {</span> <span class='diff-add'> var mode = cm.getModeAt(range.head);</span> <span class='diff-add'> var end = changeEnd(changeEvent);</span> <span class='diff-add'> if (mode.electricChars) {</span> <span class='diff-add'> for (var j = 0; j < mode.electricChars.length; j++)</span> <span class='diff-add'> if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {</span> <span class='diff-add'> indentLine(cm, end.line, "smart");</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (mode.electricInput) {</span> <span class='diff-add'> if (mode.electricInput.test(getLine(doc, end.line).text.slice(0, end.ch)))</span> <span class='diff-add'> indentLine(cm, end.line, "smart");</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> ensureCursorVisible(cm);</span> <span class='diff-add'> cm.curOp.updateInput = updateInput;</span> <span class='diff-add'> cm.curOp.typing = true;</span> <span class='diff-add'> // Don't leave long text in the textarea, since it makes further polling slow</span> <span class='diff-add'> if (text.length > 1000 || text.indexOf("\n") > -1) input.value = cm.display.prevInput = "";</span> <span class='diff-add'> else cm.display.prevInput = text;</span> <span class='diff-add'> if (withOp) endOperation(cm);</span> <span class='diff-add'> cm.state.pasteIncoming = cm.state.cutIncoming = false;</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Reset the input to correspond to the selection (or to be empty,</span> <span class='diff-add'> // when not typing and nothing is selected)</span> <span class='diff-add'> function resetInput(cm, typing) {</span> <span class='diff-add'> if (cm.display.contextMenuPending) return;</span> <span class='diff-add'> var minimal, selected, doc = cm.doc;</span> <span class='diff-add'> if (cm.somethingSelected()) {</span> <span class='diff-add'> cm.display.prevInput = "";</span> <span class='diff-add'> var range = doc.sel.primary();</span> <span class='diff-add'> minimal = hasCopyEvent &&</span> <span class='diff-add'> (range.to().line - range.from().line > 100 || (selected = cm.getSelection()).length > 1000);</span> <span class='diff-add'> var content = minimal ? "-" : selected || cm.getSelection();</span> <span class='diff-add'> cm.display.input.value = content;</span> <span class='diff-add'> if (cm.state.focused) selectInput(cm.display.input);</span> <span class='diff-add'> if (ie && ie_version >= 9) cm.display.inputHasSelection = content;</span> <span class='diff-add'> } else if (!typing) {</span> <span class='diff-add'> cm.display.prevInput = cm.display.input.value = "";</span> <span class='diff-add'> if (ie && ie_version >= 9) cm.display.inputHasSelection = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> cm.display.inaccurateSelection = minimal;</span> <span class='diff-add'> }</span> <span class='diff-add'> function focusInput(cm) {</span> <span class='diff-add'> if (cm.options.readOnly != "nocursor" && (!mobile || activeElt() != cm.display.input))</span> <span class='diff-add'> cm.display.input.focus();</span> <span class='diff-add'> }</span> <span class='diff-add'> function ensureFocus(cm) {</span> <span class='diff-add'> if (!cm.state.focused) { focusInput(cm); onFocus(cm); }</span> <span class='diff-add'> }</span> <span class='diff-add'> function isReadOnly(cm) {</span> <span class='diff-add'> return cm.options.readOnly || cm.doc.cantEdit;</span> <span class='diff-add'> }</span> <span class='diff-add'> // EVENT HANDLERS</span> <span class='diff-add'> // Attach the necessary event handlers when initializing the editor</span> <span class='diff-add'> function registerEventHandlers(cm) {</span> <span class='diff-add'> var d = cm.display;</span> <span class='diff-add'> on(d.scroller, "mousedown", operation(cm, onMouseDown));</span> <span class='diff-add'> // Older IE's will not fire a second mousedown for a double click</span> <span class='diff-add'> if (ie && ie_version < 11)</span> <span class='diff-add'> on(d.scroller, "dblclick", operation(cm, function(e) {</span> <span class='diff-add'> if (signalDOMEvent(cm, e)) return;</span> <span class='diff-add'> var pos = posFromMouse(cm, e);</span> <span class='diff-add'> if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;</span> <span class='diff-add'> e_preventDefault(e);</span> <span class='diff-add'> var word = cm.findWordAt(pos);</span> <span class='diff-add'> extendSelection(cm.doc, word.anchor, word.head);</span> <span class='diff-add'> }));</span> <span class='diff-add'> else</span> <span class='diff-add'> on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });</span> <span class='diff-add'> // Prevent normal selection in the editor (we handle our own)</span> <span class='diff-add'> on(d.lineSpace, "selectstart", function(e) {</span> <span class='diff-add'> if (!eventInWidget(d, e)) e_preventDefault(e);</span> <span class='diff-add'> });</span> <span class='diff-add'> // Some browsers fire contextmenu *after* opening the menu, at</span> <span class='diff-add'> // which point we can't mess with it anymore. Context menu is</span> <span class='diff-add'> // handled in onMouseDown for these browsers.</span> <span class='diff-add'> if (!captureRightClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);});</span> <span class='diff-add'> // Sync scrolling between fake scrollbars and real scrollable</span> <span class='diff-add'> // area, ensure viewport is updated when scrolling.</span> <span class='diff-add'> on(d.scroller, "scroll", function() {</span> <span class='diff-add'> if (d.scroller.clientHeight) {</span> <span class='diff-add'> setScrollTop(cm, d.scroller.scrollTop);</span> <span class='diff-add'> setScrollLeft(cm, d.scroller.scrollLeft, true);</span> <span class='diff-add'> signal(cm, "scroll", cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> // Listen to wheel events in order to try and update the viewport on time.</span> <span class='diff-add'> on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);});</span> <span class='diff-add'> on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);});</span> <span class='diff-add'> // Prevent wrapper from ever scrolling</span> <span class='diff-add'> on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });</span> <span class='diff-add'> on(d.input, "keyup", function(e) { onKeyUp.call(cm, e); });</span> <span class='diff-add'> on(d.input, "input", function() {</span> <span class='diff-add'> if (ie && ie_version >= 9 && cm.display.inputHasSelection) cm.display.inputHasSelection = null;</span> <span class='diff-add'> readInput(cm);</span> <span class='diff-add'> });</span> <span class='diff-add'> on(d.input, "keydown", operation(cm, onKeyDown));</span> <span class='diff-add'> on(d.input, "keypress", operation(cm, onKeyPress));</span> <span class='diff-add'> on(d.input, "focus", bind(onFocus, cm));</span> <span class='diff-add'> on(d.input, "blur", bind(onBlur, cm));</span> <span class='diff-add'> function drag_(e) {</span> <span class='diff-add'> if (!signalDOMEvent(cm, e)) e_stop(e);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (cm.options.dragDrop) {</span> <span class='diff-add'> on(d.scroller, "dragstart", function(e){onDragStart(cm, e);});</span> <span class='diff-add'> on(d.scroller, "dragenter", drag_);</span> <span class='diff-add'> on(d.scroller, "dragover", drag_);</span> <span class='diff-add'> on(d.scroller, "drop", operation(cm, onDrop));</span> <span class='diff-add'> }</span> <span class='diff-add'> on(d.scroller, "paste", function(e) {</span> <span class='diff-add'> if (eventInWidget(d, e)) return;</span> <span class='diff-add'> cm.state.pasteIncoming = true;</span> <span class='diff-add'> focusInput(cm);</span> <span class='diff-add'> fastPoll(cm);</span> <span class='diff-add'> });</span> <span class='diff-add'> on(d.input, "paste", function() {</span> <span class='diff-add'> // Workaround for webkit bug https://bugs.webkit.org/show_bug.cgi?id=90206</span> <span class='diff-add'> // Add a char to the end of textarea before paste occur so that</span> <span class='diff-add'> // selection doesn't span to the end of textarea.</span> <span class='diff-add'> if (webkit && !cm.state.fakedLastChar && !(new Date - cm.state.lastMiddleDown < 200)) {</span> <span class='diff-add'> var start = d.input.selectionStart, end = d.input.selectionEnd;</span> <span class='diff-add'> d.input.value += "$";</span> <span class='diff-add'> // The selection end needs to be set before the start, otherwise there</span> <span class='diff-add'> // can be an intermediate non-empty selection between the two, which</span> <span class='diff-add'> // can override the middle-click paste buffer on linux and cause the</span> <span class='diff-add'> // wrong thing to get pasted.</span> <span class='diff-add'> d.input.selectionEnd = end;</span> <span class='diff-add'> d.input.selectionStart = start;</span> <span class='diff-add'> cm.state.fakedLastChar = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> cm.state.pasteIncoming = true;</span> <span class='diff-add'> fastPoll(cm);</span> <span class='diff-add'> });</span> <span class='diff-add'> function prepareCopyCut(e) {</span> <span class='diff-add'> if (cm.somethingSelected()) {</span> <span class='diff-add'> lastCopied = cm.getSelections();</span> <span class='diff-add'> if (d.inaccurateSelection) {</span> <span class='diff-add'> d.prevInput = "";</span> <span class='diff-add'> d.inaccurateSelection = false;</span> <span class='diff-add'> d.input.value = lastCopied.join("\n");</span> <span class='diff-add'> selectInput(d.input);</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var text = [], ranges = [];</span> <span class='diff-add'> for (var i = 0; i < cm.doc.sel.ranges.length; i++) {</span> <span class='diff-add'> var line = cm.doc.sel.ranges[i].head.line;</span> <span class='diff-add'> var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};</span> <span class='diff-add'> ranges.push(lineRange);</span> <span class='diff-add'> text.push(cm.getRange(lineRange.anchor, lineRange.head));</span> <span class='diff-add'> }</span> <span class='diff-add'> if (e.type == "cut") {</span> <span class='diff-add'> cm.setSelections(ranges, null, sel_dontScroll);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> d.prevInput = "";</span> <span class='diff-add'> d.input.value = text.join("\n");</span> <span class='diff-add'> selectInput(d.input);</span> <span class='diff-add'> }</span> <span class='diff-add'> lastCopied = text;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (e.type == "cut") cm.state.cutIncoming = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> on(d.input, "cut", prepareCopyCut);</span> <span class='diff-add'> on(d.input, "copy", prepareCopyCut);</span> <span class='diff-add'> // Needed to handle Tab key in KHTML</span> <span class='diff-add'> if (khtml) on(d.sizer, "mouseup", function() {</span> <span class='diff-add'> if (activeElt() == d.input) d.input.blur();</span> <span class='diff-add'> focusInput(cm);</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> // Called when the window resizes</span> <span class='diff-add'> function onResize(cm) {</span> <span class='diff-add'> var d = cm.display;</span> <span class='diff-add'> if (d.lastWrapHeight == d.wrapper.clientHeight && d.lastWrapWidth == d.wrapper.clientWidth)</span> <span class='diff-add'> return;</span> <span class='diff-add'> // Might be a text scaling operation, clear size caches.</span> <span class='diff-add'> d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;</span> <span class='diff-add'> d.scrollbarsClipped = false;</span> <span class='diff-add'> cm.setSize();</span> <span class='diff-add'> }</span> <span class='diff-add'> // MOUSE EVENTS</span> <span class='diff-add'> // Return true when the given mouse event happened in a widget</span> <span class='diff-add'> function eventInWidget(display, e) {</span> <span class='diff-add'> for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {</span> <span class='diff-add'> if (!n || n.getAttribute("cm-ignore-events") == "true" || n.parentNode == display.sizer && n != display.mover) return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Given a mouse event, find the corresponding position. If liberal</span> <span class='diff-add'> // is false, it checks whether a gutter or scrollbar was clicked,</span> <span class='diff-add'> // and returns null if it was. forRect is used by rectangular</span> <span class='diff-add'> // selections, and tries to estimate a character position even for</span> <span class='diff-add'> // coordinates beyond the right of the text.</span> <span class='diff-add'> function posFromMouse(cm, e, liberal, forRect) {</span> <span class='diff-add'> var display = cm.display;</span> <span class='diff-add'> if (!liberal && e_target(e).getAttribute("not-content") == "true") return null;</span> <span class='diff-add'> var x, y, space = display.lineSpace.getBoundingClientRect();</span> <span class='diff-add'> // Fails unpredictably on IE[67] when mouse is dragged around quickly.</span> <span class='diff-add'> try { x = e.clientX - space.left; y = e.clientY - space.top; }</span> <span class='diff-add'> catch (e) { return null; }</span> <span class='diff-add'> var coords = coordsChar(cm, x, y), line;</span> <span class='diff-add'> if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {</span> <span class='diff-add'> var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;</span> <span class='diff-add'> coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));</span> <span class='diff-add'> }</span> <span class='diff-add'> return coords;</span> <span class='diff-add'> }</span> <span class='diff-add'> // A mouse down can be a single click, double click, triple click,</span> <span class='diff-add'> // start of selection drag, start of text drag, new cursor</span> <span class='diff-add'> // (ctrl-click), rectangle drag (alt-drag), or xwin</span> <span class='diff-add'> // middle-click-paste. Or it might be a click on something we should</span> <span class='diff-add'> // not interfere with, such as a scrollbar or widget.</span> <span class='diff-add'> function onMouseDown(e) {</span> <span class='diff-add'> if (signalDOMEvent(this, e)) return;</span> <span class='diff-add'> var cm = this, display = cm.display;</span> <span class='diff-add'> display.shift = e.shiftKey;</span> <span class='diff-add'> if (eventInWidget(display, e)) {</span> <span class='diff-add'> if (!webkit) {</span> <span class='diff-add'> // Briefly turn off draggability, to allow widgets to do</span> <span class='diff-add'> // normal dragging things.</span> <span class='diff-add'> display.scroller.draggable = false;</span> <span class='diff-add'> setTimeout(function(){display.scroller.draggable = true;}, 100);</span> <span class='diff-add'> }</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (clickInGutter(cm, e)) return;</span> <span class='diff-add'> var start = posFromMouse(cm, e);</span> <span class='diff-add'> window.focus();</span> <span class='diff-add'> switch (e_button(e)) {</span> <span class='diff-add'> case 1:</span> <span class='diff-add'> if (start)</span> <span class='diff-add'> leftButtonDown(cm, e, start);</span> <span class='diff-add'> else if (e_target(e) == display.scroller)</span> <span class='diff-add'> e_preventDefault(e);</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 2:</span> <span class='diff-add'> if (webkit) cm.state.lastMiddleDown = +new Date;</span> <span class='diff-add'> if (start) extendSelection(cm.doc, start);</span> <span class='diff-add'> setTimeout(bind(focusInput, cm), 20);</span> <span class='diff-add'> e_preventDefault(e);</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 3:</span> <span class='diff-add'> if (captureRightClick) onContextMenu(cm, e);</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> var lastClick, lastDoubleClick;</span> <span class='diff-add'> function leftButtonDown(cm, e, start) {</span> <span class='diff-add'> setTimeout(bind(ensureFocus, cm), 0);</span> <span class='diff-add'> var now = +new Date, type;</span> <span class='diff-add'> if (lastDoubleClick && lastDoubleClick.time > now - 400 && cmp(lastDoubleClick.pos, start) == 0) {</span> <span class='diff-add'> type = "triple";</span> <span class='diff-add'> } else if (lastClick && lastClick.time > now - 400 && cmp(lastClick.pos, start) == 0) {</span> <span class='diff-add'> type = "double";</span> <span class='diff-add'> lastDoubleClick = {time: now, pos: start};</span> <span class='diff-add'> } else {</span> <span class='diff-add'> type = "single";</span> <span class='diff-add'> lastClick = {time: now, pos: start};</span> <span class='diff-add'> }</span> <span class='diff-add'> var sel = cm.doc.sel, modifier = mac ? e.metaKey : e.ctrlKey, contained;</span> <span class='diff-add'> if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) &&</span> <span class='diff-add'> type == "single" && (contained = sel.contains(start)) > -1 &&</span> <span class='diff-add'> !sel.ranges[contained].empty())</span> <span class='diff-add'> leftButtonStartDrag(cm, e, start, modifier);</span> <span class='diff-add'> else</span> <span class='diff-add'> leftButtonSelect(cm, e, start, type, modifier);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Start a text drag. When it ends, see if any dragging actually</span> <span class='diff-add'> // happen, and treat as a click if it didn't.</span> <span class='diff-add'> function leftButtonStartDrag(cm, e, start, modifier) {</span> <span class='diff-add'> var display = cm.display;</span> <span class='diff-add'> var dragEnd = operation(cm, function(e2) {</span> <span class='diff-add'> if (webkit) display.scroller.draggable = false;</span> <span class='diff-add'> cm.state.draggingText = false;</span> <span class='diff-add'> off(document, "mouseup", dragEnd);</span> <span class='diff-add'> off(display.scroller, "drop", dragEnd);</span> <span class='diff-add'> if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {</span> <span class='diff-add'> e_preventDefault(e2);</span> <span class='diff-add'> if (!modifier)</span> <span class='diff-add'> extendSelection(cm.doc, start);</span> <span class='diff-add'> focusInput(cm);</span> <span class='diff-add'> // Work around unexplainable focus problem in IE9 (#2127)</span> <span class='diff-add'> if (ie && ie_version == 9)</span> <span class='diff-add'> setTimeout(function() {document.body.focus(); focusInput(cm);}, 20);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> // Let the drag handler handle this.</span> <span class='diff-add'> if (webkit) display.scroller.draggable = true;</span> <span class='diff-add'> cm.state.draggingText = dragEnd;</span> <span class='diff-add'> // IE's approach to draggable</span> <span class='diff-add'> if (display.scroller.dragDrop) display.scroller.dragDrop();</span> <span class='diff-add'> on(document, "mouseup", dragEnd);</span> <span class='diff-add'> on(display.scroller, "drop", dragEnd);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Normal selection, as opposed to text dragging.</span> <span class='diff-add'> function leftButtonSelect(cm, e, start, type, addNew) {</span> <span class='diff-add'> var display = cm.display, doc = cm.doc;</span> <span class='diff-add'> e_preventDefault(e);</span> <span class='diff-add'> var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;</span> <span class='diff-add'> if (addNew && !e.shiftKey) {</span> <span class='diff-add'> ourIndex = doc.sel.contains(start);</span> <span class='diff-add'> if (ourIndex > -1)</span> <span class='diff-add'> ourRange = ranges[ourIndex];</span> <span class='diff-add'> else</span> <span class='diff-add'> ourRange = new Range(start, start);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> ourRange = doc.sel.primary();</span> <span class='diff-add'> }</span> <span class='diff-add'> if (e.altKey) {</span> <span class='diff-add'> type = "rect";</span> <span class='diff-add'> if (!addNew) ourRange = new Range(start, start);</span> <span class='diff-add'> start = posFromMouse(cm, e, true, true);</span> <span class='diff-add'> ourIndex = -1;</span> <span class='diff-add'> } else if (type == "double") {</span> <span class='diff-add'> var word = cm.findWordAt(start);</span> <span class='diff-add'> if (cm.display.shift || doc.extend)</span> <span class='diff-add'> ourRange = extendRange(doc, ourRange, word.anchor, word.head);</span> <span class='diff-add'> else</span> <span class='diff-add'> ourRange = word;</span> <span class='diff-add'> } else if (type == "triple") {</span> <span class='diff-add'> var line = new Range(Pos(start.line, 0), clipPos(doc, Pos(start.line + 1, 0)));</span> <span class='diff-add'> if (cm.display.shift || doc.extend)</span> <span class='diff-add'> ourRange = extendRange(doc, ourRange, line.anchor, line.head);</span> <span class='diff-add'> else</span> <span class='diff-add'> ourRange = line;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> ourRange = extendRange(doc, ourRange, start);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!addNew) {</span> <span class='diff-add'> ourIndex = 0;</span> <span class='diff-add'> setSelection(doc, new Selection([ourRange], 0), sel_mouse);</span> <span class='diff-add'> startSel = doc.sel;</span> <span class='diff-add'> } else if (ourIndex == -1) {</span> <span class='diff-add'> ourIndex = ranges.length;</span> <span class='diff-add'> setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex),</span> <span class='diff-add'> {scroll: false, origin: "*mouse"});</span> <span class='diff-add'> } else if (ranges.length > 1 && ranges[ourIndex].empty() && type == "single") {</span> <span class='diff-add'> setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0));</span> <span class='diff-add'> startSel = doc.sel;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);</span> <span class='diff-add'> }</span> <span class='diff-add'> var lastPos = start;</span> <span class='diff-add'> function extendTo(pos) {</span> <span class='diff-add'> if (cmp(lastPos, pos) == 0) return;</span> <span class='diff-add'> lastPos = pos;</span> <span class='diff-add'> if (type == "rect") {</span> <span class='diff-add'> var ranges = [], tabSize = cm.options.tabSize;</span> <span class='diff-add'> var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);</span> <span class='diff-add'> var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);</span> <span class='diff-add'> var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);</span> <span class='diff-add'> for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));</span> <span class='diff-add'> line <= end; line++) {</span> <span class='diff-add'> var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);</span> <span class='diff-add'> if (left == right)</span> <span class='diff-add'> ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos)));</span> <span class='diff-add'> else if (text.length > leftPos)</span> <span class='diff-add'> ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize))));</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!ranges.length) ranges.push(new Range(start, start));</span> <span class='diff-add'> setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),</span> <span class='diff-add'> {origin: "*mouse", scroll: false});</span> <span class='diff-add'> cm.scrollIntoView(pos);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var oldRange = ourRange;</span> <span class='diff-add'> var anchor = oldRange.anchor, head = pos;</span> <span class='diff-add'> if (type != "single") {</span> <span class='diff-add'> if (type == "double")</span> <span class='diff-add'> var range = cm.findWordAt(pos);</span> <span class='diff-add'> else</span> <span class='diff-add'> var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0)));</span> <span class='diff-add'> if (cmp(range.anchor, anchor) > 0) {</span> <span class='diff-add'> head = range.head;</span> <span class='diff-add'> anchor = minPos(oldRange.from(), range.anchor);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> head = range.anchor;</span> <span class='diff-add'> anchor = maxPos(oldRange.to(), range.head);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> var ranges = startSel.ranges.slice(0);</span> <span class='diff-add'> ranges[ourIndex] = new Range(clipPos(doc, anchor), head);</span> <span class='diff-add'> setSelection(doc, normalizeSelection(ranges, ourIndex), sel_mouse);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> var editorSize = display.wrapper.getBoundingClientRect();</span> <span class='diff-add'> // Used to ensure timeout re-tries don't fire when another extend</span> <span class='diff-add'> // happened in the meantime (clearTimeout isn't reliable -- at</span> <span class='diff-add'> // least on Chrome, the timeouts still happen even when cleared,</span> <span class='diff-add'> // if the clear happens after their scheduled firing time).</span> <span class='diff-add'> var counter = 0;</span> <span class='diff-add'> function extend(e) {</span> <span class='diff-add'> var curCount = ++counter;</span> <span class='diff-add'> var cur = posFromMouse(cm, e, true, type == "rect");</span> <span class='diff-add'> if (!cur) return;</span> <span class='diff-add'> if (cmp(cur, lastPos) != 0) {</span> <span class='diff-add'> ensureFocus(cm);</span> <span class='diff-add'> extendTo(cur);</span> <span class='diff-add'> var visible = visibleLines(display, doc);</span> <span class='diff-add'> if (cur.line >= visible.to || cur.line < visible.from)</span> <span class='diff-add'> setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;</span> <span class='diff-add'> if (outside) setTimeout(operation(cm, function() {</span> <span class='diff-add'> if (counter != curCount) return;</span> <span class='diff-add'> display.scroller.scrollTop += outside;</span> <span class='diff-add'> extend(e);</span> <span class='diff-add'> }), 50);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function done(e) {</span> <span class='diff-add'> counter = Infinity;</span> <span class='diff-add'> e_preventDefault(e);</span> <span class='diff-add'> focusInput(cm);</span> <span class='diff-add'> off(document, "mousemove", move);</span> <span class='diff-add'> off(document, "mouseup", up);</span> <span class='diff-add'> doc.history.lastSelOrigin = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> var move = operation(cm, function(e) {</span> <span class='diff-add'> if (!e_button(e)) done(e);</span> <span class='diff-add'> else extend(e);</span> <span class='diff-add'> });</span> <span class='diff-add'> var up = operation(cm, done);</span> <span class='diff-add'> on(document, "mousemove", move);</span> <span class='diff-add'> on(document, "mouseup", up);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Determines whether an event happened in the gutter, and fires the</span> <span class='diff-add'> // handlers for the corresponding event.</span> <span class='diff-add'> function gutterEvent(cm, e, type, prevent, signalfn) {</span> <span class='diff-add'> try { var mX = e.clientX, mY = e.clientY; }</span> <span class='diff-add'> catch(e) { return false; }</span> <span class='diff-add'> if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) return false;</span> <span class='diff-add'> if (prevent) e_preventDefault(e);</span> <span class='diff-add'> var display = cm.display;</span> <span class='diff-add'> var lineBox = display.lineDiv.getBoundingClientRect();</span> <span class='diff-add'> if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e);</span> <span class='diff-add'> mY -= lineBox.top - display.viewOffset;</span> <span class='diff-add'> for (var i = 0; i < cm.options.gutters.length; ++i) {</span> <span class='diff-add'> var g = display.gutters.childNodes[i];</span> <span class='diff-add'> if (g && g.getBoundingClientRect().right >= mX) {</span> <span class='diff-add'> var line = lineAtHeight(cm.doc, mY);</span> <span class='diff-add'> var gutter = cm.options.gutters[i];</span> <span class='diff-add'> signalfn(cm, type, cm, line, gutter, e);</span> <span class='diff-add'> return e_defaultPrevented(e);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function clickInGutter(cm, e) {</span> <span class='diff-add'> return gutterEvent(cm, e, "gutterClick", true, signalLater);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Kludge to work around strange IE behavior where it'll sometimes</span> <span class='diff-add'> // re-fire a series of drag-related events right after the drop (#1551)</span> <span class='diff-add'> var lastDrop = 0;</span> <span class='diff-add'> function onDrop(e) {</span> <span class='diff-add'> var cm = this;</span> <span class='diff-add'> if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))</span> <span class='diff-add'> return;</span> <span class='diff-add'> e_preventDefault(e);</span> <span class='diff-add'> if (ie) lastDrop = +new Date;</span> <span class='diff-add'> var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;</span> <span class='diff-add'> if (!pos || isReadOnly(cm)) return;</span> <span class='diff-add'> // Might be a file drop, in which case we simply extract the text</span> <span class='diff-add'> // and insert it.</span> <span class='diff-add'> if (files && files.length && window.FileReader && window.File) {</span> <span class='diff-add'> var n = files.length, text = Array(n), read = 0;</span> <span class='diff-add'> var loadFile = function(file, i) {</span> <span class='diff-add'> var reader = new FileReader;</span> <span class='diff-add'> reader.onload = operation(cm, function() {</span> <span class='diff-add'> text[i] = reader.result;</span> <span class='diff-add'> if (++read == n) {</span> <span class='diff-add'> pos = clipPos(cm.doc, pos);</span> <span class='diff-add'> var change = {from: pos, to: pos, text: splitLines(text.join("\n")), origin: "paste"};</span> <span class='diff-add'> makeChange(cm.doc, change);</span> <span class='diff-add'> setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change)));</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> reader.readAsText(file);</span> <span class='diff-add'> };</span> <span class='diff-add'> for (var i = 0; i < n; ++i) loadFile(files[i], i);</span> <span class='diff-add'> } else { // Normal drop</span> <span class='diff-add'> // Don't do a replace if the drop happened inside of the selected text.</span> <span class='diff-add'> if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {</span> <span class='diff-add'> cm.state.draggingText(e);</span> <span class='diff-add'> // Ensure the editor is re-focused</span> <span class='diff-add'> setTimeout(bind(focusInput, cm), 20);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> try {</span> <span class='diff-add'> var text = e.dataTransfer.getData("Text");</span> <span class='diff-add'> if (text) {</span> <span class='diff-add'> if (cm.state.draggingText && !(mac ? e.metaKey : e.ctrlKey))</span> <span class='diff-add'> var selected = cm.listSelections();</span> <span class='diff-add'> setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));</span> <span class='diff-add'> if (selected) for (var i = 0; i < selected.length; ++i)</span> <span class='diff-add'> replaceRange(cm.doc, "", selected[i].anchor, selected[i].head, "drag");</span> <span class='diff-add'> cm.replaceSelection(text, "around", "paste");</span> <span class='diff-add'> focusInput(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> catch(e){}</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function onDragStart(cm, e) {</span> <span class='diff-add'> if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }</span> <span class='diff-add'> if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;</span> <span class='diff-add'> e.dataTransfer.setData("Text", cm.getSelection());</span> <span class='diff-add'> // Use dummy image instead of default browsers image.</span> <span class='diff-add'> // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.</span> <span class='diff-add'> if (e.dataTransfer.setDragImage && !safari) {</span> <span class='diff-add'> var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");</span> <span class='diff-add'> img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";</span> <span class='diff-add'> if (presto) {</span> <span class='diff-add'> img.width = img.height = 1;</span> <span class='diff-add'> cm.display.wrapper.appendChild(img);</span> <span class='diff-add'> // Force a relayout, or Opera won't use our image for some obscure reason</span> <span class='diff-add'> img._top = img.offsetTop;</span> <span class='diff-add'> }</span> <span class='diff-add'> e.dataTransfer.setDragImage(img, 0, 0);</span> <span class='diff-add'> if (presto) img.parentNode.removeChild(img);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // SCROLL EVENTS</span> <span class='diff-add'> // Sync the scrollable area and scrollbars, ensure the viewport</span> <span class='diff-add'> // covers the visible area.</span> <span class='diff-add'> function setScrollTop(cm, val) {</span> <span class='diff-add'> if (Math.abs(cm.doc.scrollTop - val) < 2) return;</span> <span class='diff-add'> cm.doc.scrollTop = val;</span> <span class='diff-add'> if (!gecko) updateDisplaySimple(cm, {top: val});</span> <span class='diff-add'> if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;</span> <span class='diff-add'> cm.display.scrollbars.setScrollTop(val);</span> <span class='diff-add'> if (gecko) updateDisplaySimple(cm);</span> <span class='diff-add'> startWorker(cm, 100);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Sync scroller and scrollbar, ensure the gutter elements are</span> <span class='diff-add'> // aligned.</span> <span class='diff-add'> function setScrollLeft(cm, val, isScroller) {</span> <span class='diff-add'> if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;</span> <span class='diff-add'> val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);</span> <span class='diff-add'> cm.doc.scrollLeft = val;</span> <span class='diff-add'> alignHorizontally(cm);</span> <span class='diff-add'> if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;</span> <span class='diff-add'> cm.display.scrollbars.setScrollLeft(val);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Since the delta values reported on mouse wheel events are</span> <span class='diff-add'> // unstandardized between browsers and even browser versions, and</span> <span class='diff-add'> // generally horribly unpredictable, this code starts by measuring</span> <span class='diff-add'> // the scroll effect that the first few mouse wheel events have,</span> <span class='diff-add'> // and, from that, detects the way it can convert deltas to pixel</span> <span class='diff-add'> // offsets afterwards.</span> <span class='diff-add'> //</span> <span class='diff-add'> // The reason we want to know the amount a wheel event will scroll</span> <span class='diff-add'> // is that it gives us a chance to update the display before the</span> <span class='diff-add'> // actual scrolling happens, reducing flickering.</span> <span class='diff-add'> var wheelSamples = 0, wheelPixelsPerUnit = null;</span> <span class='diff-add'> // Fill in a browser-detected starting value on browsers where we</span> <span class='diff-add'> // know one. These don't have to be accurate -- the result of them</span> <span class='diff-add'> // being wrong would just be a slight flicker on the first wheel</span> <span class='diff-add'> // scroll (if it is large enough).</span> <span class='diff-add'> if (ie) wheelPixelsPerUnit = -.53;</span> <span class='diff-add'> else if (gecko) wheelPixelsPerUnit = 15;</span> <span class='diff-add'> else if (chrome) wheelPixelsPerUnit = -.7;</span> <span class='diff-add'> else if (safari) wheelPixelsPerUnit = -1/3;</span> <span class='diff-add'> var wheelEventDelta = function(e) {</span> <span class='diff-add'> var dx = e.wheelDeltaX, dy = e.wheelDeltaY;</span> <span class='diff-add'> if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;</span> <span class='diff-add'> if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;</span> <span class='diff-add'> else if (dy == null) dy = e.wheelDelta;</span> <span class='diff-add'> return {x: dx, y: dy};</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeMirror.wheelEventPixels = function(e) {</span> <span class='diff-add'> var delta = wheelEventDelta(e);</span> <span class='diff-add'> delta.x *= wheelPixelsPerUnit;</span> <span class='diff-add'> delta.y *= wheelPixelsPerUnit;</span> <span class='diff-add'> return delta;</span> <span class='diff-add'> };</span> <span class='diff-add'> function onScrollWheel(cm, e) {</span> <span class='diff-add'> var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;</span> <span class='diff-add'> var display = cm.display, scroll = display.scroller;</span> <span class='diff-add'> // Quit if there's nothing to scroll here</span> <span class='diff-add'> if (!(dx && scroll.scrollWidth > scroll.clientWidth ||</span> <span class='diff-add'> dy && scroll.scrollHeight > scroll.clientHeight)) return;</span> <span class='diff-add'> // Webkit browsers on OS X abort momentum scrolls when the target</span> <span class='diff-add'> // of the scroll event is removed from the scrollable element.</span> <span class='diff-add'> // This hack (see related code in patchDisplay) makes sure the</span> <span class='diff-add'> // element is kept around.</span> <span class='diff-add'> if (dy && mac && webkit) {</span> <span class='diff-add'> outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {</span> <span class='diff-add'> for (var i = 0; i < view.length; i++) {</span> <span class='diff-add'> if (view[i].node == cur) {</span> <span class='diff-add'> cm.display.currentWheelTarget = cur;</span> <span class='diff-add'> break outer;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // On some browsers, horizontal scrolling will cause redraws to</span> <span class='diff-add'> // happen before the gutter has been realigned, causing it to</span> <span class='diff-add'> // wriggle around in a most unseemly way. When we have an</span> <span class='diff-add'> // estimated pixels/delta value, we just handle horizontal</span> <span class='diff-add'> // scrolling entirely here. It'll be slightly off from native, but</span> <span class='diff-add'> // better than glitching out.</span> <span class='diff-add'> if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {</span> <span class='diff-add'> if (dy)</span> <span class='diff-add'> setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));</span> <span class='diff-add'> setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));</span> <span class='diff-add'> e_preventDefault(e);</span> <span class='diff-add'> display.wheelStartX = null; // Abort measurement, if in progress</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> // 'Project' the visible viewport to cover the area that is being</span> <span class='diff-add'> // scrolled into view (if we know enough to estimate it).</span> <span class='diff-add'> if (dy && wheelPixelsPerUnit != null) {</span> <span class='diff-add'> var pixels = dy * wheelPixelsPerUnit;</span> <span class='diff-add'> var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;</span> <span class='diff-add'> if (pixels < 0) top = Math.max(0, top + pixels - 50);</span> <span class='diff-add'> else bot = Math.min(cm.doc.height, bot + pixels + 50);</span> <span class='diff-add'> updateDisplaySimple(cm, {top: top, bottom: bot});</span> <span class='diff-add'> }</span> <span class='diff-add'> if (wheelSamples < 20) {</span> <span class='diff-add'> if (display.wheelStartX == null) {</span> <span class='diff-add'> display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;</span> <span class='diff-add'> display.wheelDX = dx; display.wheelDY = dy;</span> <span class='diff-add'> setTimeout(function() {</span> <span class='diff-add'> if (display.wheelStartX == null) return;</span> <span class='diff-add'> var movedX = scroll.scrollLeft - display.wheelStartX;</span> <span class='diff-add'> var movedY = scroll.scrollTop - display.wheelStartY;</span> <span class='diff-add'> var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||</span> <span class='diff-add'> (movedX && display.wheelDX && movedX / display.wheelDX);</span> <span class='diff-add'> display.wheelStartX = display.wheelStartY = null;</span> <span class='diff-add'> if (!sample) return;</span> <span class='diff-add'> wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);</span> <span class='diff-add'> ++wheelSamples;</span> <span class='diff-add'> }, 200);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> display.wheelDX += dx; display.wheelDY += dy;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // KEY EVENTS</span> <span class='diff-add'> // Run a handler that was bound to a key.</span> <span class='diff-add'> function doHandleBinding(cm, bound, dropShift) {</span> <span class='diff-add'> if (typeof bound == "string") {</span> <span class='diff-add'> bound = commands[bound];</span> <span class='diff-add'> if (!bound) return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Ensure previous input has been read, so that the handler sees a</span> <span class='diff-add'> // consistent view of the document</span> <span class='diff-add'> if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false;</span> <span class='diff-add'> var prevShift = cm.display.shift, done = false;</span> <span class='diff-add'> try {</span> <span class='diff-add'> if (isReadOnly(cm)) cm.state.suppressEdits = true;</span> <span class='diff-add'> if (dropShift) cm.display.shift = false;</span> <span class='diff-add'> done = bound(cm) != Pass;</span> <span class='diff-add'> } finally {</span> <span class='diff-add'> cm.display.shift = prevShift;</span> <span class='diff-add'> cm.state.suppressEdits = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> return done;</span> <span class='diff-add'> }</span> <span class='diff-add'> function lookupKeyForEditor(cm, name, handle) {</span> <span class='diff-add'> for (var i = 0; i < cm.state.keyMaps.length; i++) {</span> <span class='diff-add'> var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);</span> <span class='diff-add'> if (result) return result;</span> <span class='diff-add'> }</span> <span class='diff-add'> return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))</span> <span class='diff-add'> || lookupKey(name, cm.options.keyMap, handle, cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> var stopSeq = new Delayed;</span> <span class='diff-add'> function dispatchKey(cm, name, e, handle) {</span> <span class='diff-add'> var seq = cm.state.keySeq;</span> <span class='diff-add'> if (seq) {</span> <span class='diff-add'> if (isModifierKey(name)) return "handled";</span> <span class='diff-add'> stopSeq.set(50, function() {</span> <span class='diff-add'> if (cm.state.keySeq == seq) {</span> <span class='diff-add'> cm.state.keySeq = null;</span> <span class='diff-add'> resetInput(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> name = seq + " " + name;</span> <span class='diff-add'> }</span> <span class='diff-add'> var result = lookupKeyForEditor(cm, name, handle);</span> <span class='diff-add'> if (result == "multi")</span> <span class='diff-add'> cm.state.keySeq = name;</span> <span class='diff-add'> if (result == "handled")</span> <span class='diff-add'> signalLater(cm, "keyHandled", cm, name, e);</span> <span class='diff-add'> if (result == "handled" || result == "multi") {</span> <span class='diff-add'> e_preventDefault(e);</span> <span class='diff-add'> restartBlink(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (seq && !result && /\'$/.test(name)) {</span> <span class='diff-add'> e_preventDefault(e);</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> return !!result;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Handle a key from the keydown event.</span> <span class='diff-add'> function handleKeyBinding(cm, e) {</span> <span class='diff-add'> var name = keyName(e, true);</span> <span class='diff-add'> if (!name) return false;</span> <span class='diff-add'> if (e.shiftKey && !cm.state.keySeq) {</span> <span class='diff-add'> // First try to resolve full name (including 'Shift-'). Failing</span> <span class='diff-add'> // that, see if there is a cursor-motion command (starting with</span> <span class='diff-add'> // 'go') bound to the keyname without 'Shift-'.</span> <span class='diff-add'> return dispatchKey(cm, "Shift-" + name, e, function(b) {return doHandleBinding(cm, b, true);})</span> <span class='diff-add'> || dispatchKey(cm, name, e, function(b) {</span> <span class='diff-add'> if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)</span> <span class='diff-add'> return doHandleBinding(cm, b);</span> <span class='diff-add'> });</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return dispatchKey(cm, name, e, function(b) { return doHandleBinding(cm, b); });</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Handle a key from the keypress event</span> <span class='diff-add'> function handleCharBinding(cm, e, ch) {</span> <span class='diff-add'> return dispatchKey(cm, "'" + ch + "'", e,</span> <span class='diff-add'> function(b) { return doHandleBinding(cm, b, true); });</span> <span class='diff-add'> }</span> <span class='diff-add'> var lastStoppedKey = null;</span> <span class='diff-add'> function onKeyDown(e) {</span> <span class='diff-add'> var cm = this;</span> <span class='diff-add'> ensureFocus(cm);</span> <span class='diff-add'> if (signalDOMEvent(cm, e)) return;</span> <span class='diff-add'> // IE does strange things with escape.</span> <span class='diff-add'> if (ie && ie_version < 11 && e.keyCode == 27) e.returnValue = false;</span> <span class='diff-add'> var code = e.keyCode;</span> <span class='diff-add'> cm.display.shift = code == 16 || e.shiftKey;</span> <span class='diff-add'> var handled = handleKeyBinding(cm, e);</span> <span class='diff-add'> if (presto) {</span> <span class='diff-add'> lastStoppedKey = handled ? code : null;</span> <span class='diff-add'> // Opera has no cut event... we try to at least catch the key combo</span> <span class='diff-add'> if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))</span> <span class='diff-add'> cm.replaceSelection("", null, "cut");</span> <span class='diff-add'> }</span> <span class='diff-add'> // Turn mouse into crosshair when Alt is held on Mac.</span> <span class='diff-add'> if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className))</span> <span class='diff-add'> showCrossHair(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> function showCrossHair(cm) {</span> <span class='diff-add'> var lineDiv = cm.display.lineDiv;</span> <span class='diff-add'> addClass(lineDiv, "CodeMirror-crosshair");</span> <span class='diff-add'> function up(e) {</span> <span class='diff-add'> if (e.keyCode == 18 || !e.altKey) {</span> <span class='diff-add'> rmClass(lineDiv, "CodeMirror-crosshair");</span> <span class='diff-add'> off(document, "keyup", up);</span> <span class='diff-add'> off(document, "mouseover", up);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> on(document, "keyup", up);</span> <span class='diff-add'> on(document, "mouseover", up);</span> <span class='diff-add'> }</span> <span class='diff-add'> function onKeyUp(e) {</span> <span class='diff-add'> if (e.keyCode == 16) this.doc.sel.shift = false;</span> <span class='diff-add'> signalDOMEvent(this, e);</span> <span class='diff-add'> }</span> <span class='diff-add'> function onKeyPress(e) {</span> <span class='diff-add'> var cm = this;</span> <span class='diff-add'> if (signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) return;</span> <span class='diff-add'> var keyCode = e.keyCode, charCode = e.charCode;</span> <span class='diff-add'> if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}</span> <span class='diff-add'> if (((presto && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return;</span> <span class='diff-add'> var ch = String.fromCharCode(charCode == null ? keyCode : charCode);</span> <span class='diff-add'> if (handleCharBinding(cm, e, ch)) return;</span> <span class='diff-add'> if (ie && ie_version >= 9) cm.display.inputHasSelection = null;</span> <span class='diff-add'> fastPoll(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> // FOCUS/BLUR EVENTS</span> <span class='diff-add'> function onFocus(cm) {</span> <span class='diff-add'> if (cm.options.readOnly == "nocursor") return;</span> <span class='diff-add'> if (!cm.state.focused) {</span> <span class='diff-add'> signal(cm, "focus", cm);</span> <span class='diff-add'> cm.state.focused = true;</span> <span class='diff-add'> addClass(cm.display.wrapper, "CodeMirror-focused");</span> <span class='diff-add'> // The prevInput test prevents this from firing when a context</span> <span class='diff-add'> // menu is closed (since the resetInput would kill the</span> <span class='diff-add'> // select-all detection hack)</span> <span class='diff-add'> if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {</span> <span class='diff-add'> resetInput(cm);</span> <span class='diff-add'> if (webkit) setTimeout(bind(resetInput, cm, true), 0); // Issue #1730</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> slowPoll(cm);</span> <span class='diff-add'> restartBlink(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> function onBlur(cm) {</span> <span class='diff-add'> if (cm.state.focused) {</span> <span class='diff-add'> signal(cm, "blur", cm);</span> <span class='diff-add'> cm.state.focused = false;</span> <span class='diff-add'> rmClass(cm.display.wrapper, "CodeMirror-focused");</span> <span class='diff-add'> }</span> <span class='diff-add'> clearInterval(cm.display.blinker);</span> <span class='diff-add'> setTimeout(function() {if (!cm.state.focused) cm.display.shift = false;}, 150);</span> <span class='diff-add'> }</span> <span class='diff-add'> // CONTEXT MENU HANDLING</span> <span class='diff-add'> // To make the context menu work, we need to briefly unhide the</span> <span class='diff-add'> // textarea (making it as unobtrusive as possible) to let the</span> <span class='diff-add'> // right-click take effect on it.</span> <span class='diff-add'> function onContextMenu(cm, e) {</span> <span class='diff-add'> if (signalDOMEvent(cm, e, "contextmenu")) return;</span> <span class='diff-add'> var display = cm.display;</span> <span class='diff-add'> if (eventInWidget(display, e) || contextMenuInGutter(cm, e)) return;</span> <span class='diff-add'> var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;</span> <span class='diff-add'> if (!pos || presto) return; // Opera is difficult.</span> <span class='diff-add'> // Reset the current text selection only if the click is done outside of the selection</span> <span class='diff-add'> // and 'resetSelectionOnContextMenu' option is true.</span> <span class='diff-add'> var reset = cm.options.resetSelectionOnContextMenu;</span> <span class='diff-add'> if (reset && cm.doc.sel.contains(pos) == -1)</span> <span class='diff-add'> operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll);</span> <span class='diff-add'> var oldCSS = display.input.style.cssText;</span> <span class='diff-add'> display.inputDiv.style.position = "absolute";</span> <span class='diff-add'> display.input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) +</span> <span class='diff-add'> "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: " +</span> <span class='diff-add'> (ie ? "rgba(255, 255, 255, .05)" : "transparent") +</span> <span class='diff-add'> "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";</span> <span class='diff-add'> if (webkit) var oldScrollY = window.scrollY; // Work around Chrome issue (#2712)</span> <span class='diff-add'> focusInput(cm);</span> <span class='diff-add'> if (webkit) window.scrollTo(null, oldScrollY);</span> <span class='diff-add'> resetInput(cm);</span> <span class='diff-add'> // Adds "Select all" to context menu in FF</span> <span class='diff-add'> if (!cm.somethingSelected()) display.input.value = display.prevInput = " ";</span> <span class='diff-add'> display.contextMenuPending = true;</span> <span class='diff-add'> display.selForContextMenu = cm.doc.sel;</span> <span class='diff-add'> clearTimeout(display.detectingSelectAll);</span> <span class='diff-add'> // Select-all will be greyed out if there's nothing to select, so</span> <span class='diff-add'> // this adds a zero-width space so that we can later check whether</span> <span class='diff-add'> // it got selected.</span> <span class='diff-add'> function prepareSelectAllHack() {</span> <span class='diff-add'> if (display.input.selectionStart != null) {</span> <span class='diff-add'> var selected = cm.somethingSelected();</span> <span class='diff-add'> var extval = display.input.value = "\u200b" + (selected ? display.input.value : "");</span> <span class='diff-add'> display.prevInput = selected ? "" : "\u200b";</span> <span class='diff-add'> display.input.selectionStart = 1; display.input.selectionEnd = extval.length;</span> <span class='diff-add'> // Re-set this, in case some other handler touched the</span> <span class='diff-add'> // selection in the meantime.</span> <span class='diff-add'> display.selForContextMenu = cm.doc.sel;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function rehide() {</span> <span class='diff-add'> display.contextMenuPending = false;</span> <span class='diff-add'> display.inputDiv.style.position = "relative";</span> <span class='diff-add'> display.input.style.cssText = oldCSS;</span> <span class='diff-add'> if (ie && ie_version < 9) display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos);</span> <span class='diff-add'> slowPoll(cm);</span> <span class='diff-add'> // Try to detect the user choosing select-all</span> <span class='diff-add'> if (display.input.selectionStart != null) {</span> <span class='diff-add'> if (!ie || (ie && ie_version < 9)) prepareSelectAllHack();</span> <span class='diff-add'> var i = 0, poll = function() {</span> <span class='diff-add'> if (display.selForContextMenu == cm.doc.sel && display.input.selectionStart == 0)</span> <span class='diff-add'> operation(cm, commands.selectAll)(cm);</span> <span class='diff-add'> else if (i++ < 10) display.detectingSelectAll = setTimeout(poll, 500);</span> <span class='diff-add'> else resetInput(cm);</span> <span class='diff-add'> };</span> <span class='diff-add'> display.detectingSelectAll = setTimeout(poll, 200);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (ie && ie_version >= 9) prepareSelectAllHack();</span> <span class='diff-add'> if (captureRightClick) {</span> <span class='diff-add'> e_stop(e);</span> <span class='diff-add'> var mouseup = function() {</span> <span class='diff-add'> off(window, "mouseup", mouseup);</span> <span class='diff-add'> setTimeout(rehide, 20);</span> <span class='diff-add'> };</span> <span class='diff-add'> on(window, "mouseup", mouseup);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> setTimeout(rehide, 50);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function contextMenuInGutter(cm, e) {</span> <span class='diff-add'> if (!hasHandler(cm, "gutterContextMenu")) return false;</span> <span class='diff-add'> return gutterEvent(cm, e, "gutterContextMenu", false, signal);</span> <span class='diff-add'> }</span> <span class='diff-add'> // UPDATING</span> <span class='diff-add'> // Compute the position of the end of a change (its 'to' property</span> <span class='diff-add'> // refers to the pre-change end).</span> <span class='diff-add'> var changeEnd = CodeMirror.changeEnd = function(change) {</span> <span class='diff-add'> if (!change.text) return change.to;</span> <span class='diff-add'> return Pos(change.from.line + change.text.length - 1,</span> <span class='diff-add'> lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0));</span> <span class='diff-add'> };</span> <span class='diff-add'> // Adjust a position to refer to the post-change position of the</span> <span class='diff-add'> // same text, or the end of the change if the change covers it.</span> <span class='diff-add'> function adjustForChange(pos, change) {</span> <span class='diff-add'> if (cmp(pos, change.from) < 0) return pos;</span> <span class='diff-add'> if (cmp(pos, change.to) <= 0) return changeEnd(change);</span> <span class='diff-add'> var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;</span> <span class='diff-add'> if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch;</span> <span class='diff-add'> return Pos(line, ch);</span> <span class='diff-add'> }</span> <span class='diff-add'> function computeSelAfterChange(doc, change) {</span> <span class='diff-add'> var out = [];</span> <span class='diff-add'> for (var i = 0; i < doc.sel.ranges.length; i++) {</span> <span class='diff-add'> var range = doc.sel.ranges[i];</span> <span class='diff-add'> out.push(new Range(adjustForChange(range.anchor, change),</span> <span class='diff-add'> adjustForChange(range.head, change)));</span> <span class='diff-add'> }</span> <span class='diff-add'> return normalizeSelection(out, doc.sel.primIndex);</span> <span class='diff-add'> }</span> <span class='diff-add'> function offsetPos(pos, old, nw) {</span> <span class='diff-add'> if (pos.line == old.line)</span> <span class='diff-add'> return Pos(nw.line, pos.ch - old.ch + nw.ch);</span> <span class='diff-add'> else</span> <span class='diff-add'> return Pos(nw.line + (pos.line - old.line), pos.ch);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Used by replaceSelections to allow moving the selection to the</span> <span class='diff-add'> // start or around the replaced test. Hint may be "start" or "around".</span> <span class='diff-add'> function computeReplacedSel(doc, changes, hint) {</span> <span class='diff-add'> var out = [];</span> <span class='diff-add'> var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;</span> <span class='diff-add'> for (var i = 0; i < changes.length; i++) {</span> <span class='diff-add'> var change = changes[i];</span> <span class='diff-add'> var from = offsetPos(change.from, oldPrev, newPrev);</span> <span class='diff-add'> var to = offsetPos(changeEnd(change), oldPrev, newPrev);</span> <span class='diff-add'> oldPrev = change.to;</span> <span class='diff-add'> newPrev = to;</span> <span class='diff-add'> if (hint == "around") {</span> <span class='diff-add'> var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;</span> <span class='diff-add'> out[i] = new Range(inv ? to : from, inv ? from : to);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> out[i] = new Range(from, from);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return new Selection(out, doc.sel.primIndex);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Allow "beforeChange" event handlers to influence a change</span> <span class='diff-add'> function filterChange(doc, change, update) {</span> <span class='diff-add'> var obj = {</span> <span class='diff-add'> canceled: false,</span> <span class='diff-add'> from: change.from,</span> <span class='diff-add'> to: change.to,</span> <span class='diff-add'> text: change.text,</span> <span class='diff-add'> origin: change.origin,</span> <span class='diff-add'> cancel: function() { this.canceled = true; }</span> <span class='diff-add'> };</span> <span class='diff-add'> if (update) obj.update = function(from, to, text, origin) {</span> <span class='diff-add'> if (from) this.from = clipPos(doc, from);</span> <span class='diff-add'> if (to) this.to = clipPos(doc, to);</span> <span class='diff-add'> if (text) this.text = text;</span> <span class='diff-add'> if (origin !== undefined) this.origin = origin;</span> <span class='diff-add'> };</span> <span class='diff-add'> signal(doc, "beforeChange", doc, obj);</span> <span class='diff-add'> if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj);</span> <span class='diff-add'> if (obj.canceled) return null;</span> <span class='diff-add'> return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin};</span> <span class='diff-add'> }</span> <span class='diff-add'> // Apply a change to a document, and add it to the document's</span> <span class='diff-add'> // history, and propagating it to all linked documents.</span> <span class='diff-add'> function makeChange(doc, change, ignoreReadOnly) {</span> <span class='diff-add'> if (doc.cm) {</span> <span class='diff-add'> if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly);</span> <span class='diff-add'> if (doc.cm.state.suppressEdits) return;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) {</span> <span class='diff-add'> change = filterChange(doc, change, true);</span> <span class='diff-add'> if (!change) return;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Possibly split or suppress the update based on the presence</span> <span class='diff-add'> // of read-only spans in its range.</span> <span class='diff-add'> var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);</span> <span class='diff-add'> if (split) {</span> <span class='diff-add'> for (var i = split.length - 1; i >= 0; --i)</span> <span class='diff-add'> makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text});</span> <span class='diff-add'> } else {</span> <span class='diff-add'> makeChangeInner(doc, change);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function makeChangeInner(doc, change) {</span> <span class='diff-add'> if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) return;</span> <span class='diff-add'> var selAfter = computeSelAfterChange(doc, change);</span> <span class='diff-add'> addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);</span> <span class='diff-add'> makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));</span> <span class='diff-add'> var rebased = [];</span> <span class='diff-add'> linkedDocs(doc, function(doc, sharedHist) {</span> <span class='diff-add'> if (!sharedHist && indexOf(rebased, doc.history) == -1) {</span> <span class='diff-add'> rebaseHist(doc.history, change);</span> <span class='diff-add'> rebased.push(doc.history);</span> <span class='diff-add'> }</span> <span class='diff-add'> makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> // Revert a change stored in a document's history.</span> <span class='diff-add'> function makeChangeFromHistory(doc, type, allowSelectionOnly) {</span> <span class='diff-add'> if (doc.cm && doc.cm.state.suppressEdits) return;</span> <span class='diff-add'> var hist = doc.history, event, selAfter = doc.sel;</span> <span class='diff-add'> var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done;</span> <span class='diff-add'> // Verify that there is a useable event (so that ctrl-z won't</span> <span class='diff-add'> // needlessly clear selection events)</span> <span class='diff-add'> for (var i = 0; i < source.length; i++) {</span> <span class='diff-add'> event = source[i];</span> <span class='diff-add'> if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (i == source.length) return;</span> <span class='diff-add'> hist.lastOrigin = hist.lastSelOrigin = null;</span> <span class='diff-add'> for (;;) {</span> <span class='diff-add'> event = source.pop();</span> <span class='diff-add'> if (event.ranges) {</span> <span class='diff-add'> pushSelectionToHistory(event, dest);</span> <span class='diff-add'> if (allowSelectionOnly && !event.equals(doc.sel)) {</span> <span class='diff-add'> setSelection(doc, event, {clearRedo: false});</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> selAfter = event;</span> <span class='diff-add'> }</span> <span class='diff-add'> else break;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Build up a reverse change object to add to the opposite history</span> <span class='diff-add'> // stack (redo when undoing, and vice versa).</span> <span class='diff-add'> var antiChanges = [];</span> <span class='diff-add'> pushSelectionToHistory(selAfter, dest);</span> <span class='diff-add'> dest.push({changes: antiChanges, generation: hist.generation});</span> <span class='diff-add'> hist.generation = event.generation || ++hist.maxGeneration;</span> <span class='diff-add'> var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange");</span> <span class='diff-add'> for (var i = event.changes.length - 1; i >= 0; --i) {</span> <span class='diff-add'> var change = event.changes[i];</span> <span class='diff-add'> change.origin = type;</span> <span class='diff-add'> if (filter && !filterChange(doc, change, false)) {</span> <span class='diff-add'> source.length = 0;</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> antiChanges.push(historyChangeFromChange(doc, change));</span> <span class='diff-add'> var after = i ? computeSelAfterChange(doc, change) : lst(source);</span> <span class='diff-add'> makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));</span> <span class='diff-add'> if (!i && doc.cm) doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)});</span> <span class='diff-add'> var rebased = [];</span> <span class='diff-add'> // Propagate to the linked documents</span> <span class='diff-add'> linkedDocs(doc, function(doc, sharedHist) {</span> <span class='diff-add'> if (!sharedHist && indexOf(rebased, doc.history) == -1) {</span> <span class='diff-add'> rebaseHist(doc.history, change);</span> <span class='diff-add'> rebased.push(doc.history);</span> <span class='diff-add'> }</span> <span class='diff-add'> makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Sub-views need their line numbers shifted when text is added</span> <span class='diff-add'> // above or below them in the parent document.</span> <span class='diff-add'> function shiftDoc(doc, distance) {</span> <span class='diff-add'> if (distance == 0) return;</span> <span class='diff-add'> doc.first += distance;</span> <span class='diff-add'> doc.sel = new Selection(map(doc.sel.ranges, function(range) {</span> <span class='diff-add'> return new Range(Pos(range.anchor.line + distance, range.anchor.ch),</span> <span class='diff-add'> Pos(range.head.line + distance, range.head.ch));</span> <span class='diff-add'> }), doc.sel.primIndex);</span> <span class='diff-add'> if (doc.cm) {</span> <span class='diff-add'> regChange(doc.cm, doc.first, doc.first - distance, distance);</span> <span class='diff-add'> for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)</span> <span class='diff-add'> regLineChange(doc.cm, l, "gutter");</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // More lower-level change function, handling only a single document</span> <span class='diff-add'> // (not linked ones).</span> <span class='diff-add'> function makeChangeSingleDoc(doc, change, selAfter, spans) {</span> <span class='diff-add'> if (doc.cm && !doc.cm.curOp)</span> <span class='diff-add'> return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans);</span> <span class='diff-add'> if (change.to.line < doc.first) {</span> <span class='diff-add'> shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (change.from.line > doc.lastLine()) return;</span> <span class='diff-add'> // Clip the change to the size of this doc</span> <span class='diff-add'> if (change.from.line < doc.first) {</span> <span class='diff-add'> var shift = change.text.length - 1 - (doc.first - change.from.line);</span> <span class='diff-add'> shiftDoc(doc, shift);</span> <span class='diff-add'> change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),</span> <span class='diff-add'> text: [lst(change.text)], origin: change.origin};</span> <span class='diff-add'> }</span> <span class='diff-add'> var last = doc.lastLine();</span> <span class='diff-add'> if (change.to.line > last) {</span> <span class='diff-add'> change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),</span> <span class='diff-add'> text: [change.text[0]], origin: change.origin};</span> <span class='diff-add'> }</span> <span class='diff-add'> change.removed = getBetween(doc, change.from, change.to);</span> <span class='diff-add'> if (!selAfter) selAfter = computeSelAfterChange(doc, change);</span> <span class='diff-add'> if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans);</span> <span class='diff-add'> else updateDoc(doc, change, spans);</span> <span class='diff-add'> setSelectionNoUndo(doc, selAfter, sel_dontScroll);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Handle the interaction of a change to a document with the editor</span> <span class='diff-add'> // that this document is part of.</span> <span class='diff-add'> function makeChangeSingleDocInEditor(cm, change, spans) {</span> <span class='diff-add'> var doc = cm.doc, display = cm.display, from = change.from, to = change.to;</span> <span class='diff-add'> var recomputeMaxLength = false, checkWidthStart = from.line;</span> <span class='diff-add'> if (!cm.options.lineWrapping) {</span> <span class='diff-add'> checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));</span> <span class='diff-add'> doc.iter(checkWidthStart, to.line + 1, function(line) {</span> <span class='diff-add'> if (line == display.maxLine) {</span> <span class='diff-add'> recomputeMaxLength = true;</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> if (doc.sel.contains(change.from, change.to) > -1)</span> <span class='diff-add'> signalCursorActivity(cm);</span> <span class='diff-add'> updateDoc(doc, change, spans, estimateHeight(cm));</span> <span class='diff-add'> if (!cm.options.lineWrapping) {</span> <span class='diff-add'> doc.iter(checkWidthStart, from.line + change.text.length, function(line) {</span> <span class='diff-add'> var len = lineLength(line);</span> <span class='diff-add'> if (len > display.maxLineLength) {</span> <span class='diff-add'> display.maxLine = line;</span> <span class='diff-add'> display.maxLineLength = len;</span> <span class='diff-add'> display.maxLineChanged = true;</span> <span class='diff-add'> recomputeMaxLength = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> if (recomputeMaxLength) cm.curOp.updateMaxLine = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Adjust frontier, schedule worker</span> <span class='diff-add'> doc.frontier = Math.min(doc.frontier, from.line);</span> <span class='diff-add'> startWorker(cm, 400);</span> <span class='diff-add'> var lendiff = change.text.length - (to.line - from.line) - 1;</span> <span class='diff-add'> // Remember that these lines changed, for updating the display</span> <span class='diff-add'> if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))</span> <span class='diff-add'> regLineChange(cm, from.line, "text");</span> <span class='diff-add'> else</span> <span class='diff-add'> regChange(cm, from.line, to.line + 1, lendiff);</span> <span class='diff-add'> var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change");</span> <span class='diff-add'> if (changeHandler || changesHandler) {</span> <span class='diff-add'> var obj = {</span> <span class='diff-add'> from: from, to: to,</span> <span class='diff-add'> text: change.text,</span> <span class='diff-add'> removed: change.removed,</span> <span class='diff-add'> origin: change.origin</span> <span class='diff-add'> };</span> <span class='diff-add'> if (changeHandler) signalLater(cm, "change", cm, obj);</span> <span class='diff-add'> if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj);</span> <span class='diff-add'> }</span> <span class='diff-add'> cm.display.selForContextMenu = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> function replaceRange(doc, code, from, to, origin) {</span> <span class='diff-add'> if (!to) to = from;</span> <span class='diff-add'> if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; }</span> <span class='diff-add'> if (typeof code == "string") code = splitLines(code);</span> <span class='diff-add'> makeChange(doc, {from: from, to: to, text: code, origin: origin});</span> <span class='diff-add'> }</span> <span class='diff-add'> // SCROLLING THINGS INTO VIEW</span> <span class='diff-add'> // If an editor sits on the top or bottom of the window, partially</span> <span class='diff-add'> // scrolled out of view, this ensures that the cursor is visible.</span> <span class='diff-add'> function maybeScrollWindow(cm, coords) {</span> <span class='diff-add'> if (signalDOMEvent(cm, "scrollCursorIntoView")) return;</span> <span class='diff-add'> var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;</span> <span class='diff-add'> if (coords.top + box.top < 0) doScroll = true;</span> <span class='diff-add'> else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;</span> <span class='diff-add'> if (doScroll != null && !phantom) {</span> <span class='diff-add'> var scrollNode = elt("div", "\u200b", null, "position: absolute; top: " +</span> <span class='diff-add'> (coords.top - display.viewOffset - paddingTop(cm.display)) + "px; height: " +</span> <span class='diff-add'> (coords.bottom - coords.top + scrollGap(cm) + display.barHeight) + "px; left: " +</span> <span class='diff-add'> coords.left + "px; width: 2px;");</span> <span class='diff-add'> cm.display.lineSpace.appendChild(scrollNode);</span> <span class='diff-add'> scrollNode.scrollIntoView(doScroll);</span> <span class='diff-add'> cm.display.lineSpace.removeChild(scrollNode);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Scroll a given position into view (immediately), verifying that</span> <span class='diff-add'> // it actually became visible (as line heights are accurately</span> <span class='diff-add'> // measured, the position of something may 'drift' during drawing).</span> <span class='diff-add'> function scrollPosIntoView(cm, pos, end, margin) {</span> <span class='diff-add'> if (margin == null) margin = 0;</span> <span class='diff-add'> for (var limit = 0; limit < 5; limit++) {</span> <span class='diff-add'> var changed = false, coords = cursorCoords(cm, pos);</span> <span class='diff-add'> var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);</span> <span class='diff-add'> var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left),</span> <span class='diff-add'> Math.min(coords.top, endCoords.top) - margin,</span> <span class='diff-add'> Math.max(coords.left, endCoords.left),</span> <span class='diff-add'> Math.max(coords.bottom, endCoords.bottom) + margin);</span> <span class='diff-add'> var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;</span> <span class='diff-add'> if (scrollPos.scrollTop != null) {</span> <span class='diff-add'> setScrollTop(cm, scrollPos.scrollTop);</span> <span class='diff-add'> if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (scrollPos.scrollLeft != null) {</span> <span class='diff-add'> setScrollLeft(cm, scrollPos.scrollLeft);</span> <span class='diff-add'> if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!changed) break;</span> <span class='diff-add'> }</span> <span class='diff-add'> return coords;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Scroll a given set of coordinates into view (immediately).</span> <span class='diff-add'> function scrollIntoView(cm, x1, y1, x2, y2) {</span> <span class='diff-add'> var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2);</span> <span class='diff-add'> if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop);</span> <span class='diff-add'> if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Calculate a new scroll position needed to scroll the given</span> <span class='diff-add'> // rectangle into view. Returns an object with scrollTop and</span> <span class='diff-add'> // scrollLeft properties. When these are undefined, the</span> <span class='diff-add'> // vertical/horizontal position does not need to be adjusted.</span> <span class='diff-add'> function calculateScrollPos(cm, x1, y1, x2, y2) {</span> <span class='diff-add'> var display = cm.display, snapMargin = textHeight(cm.display);</span> <span class='diff-add'> if (y1 < 0) y1 = 0;</span> <span class='diff-add'> var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;</span> <span class='diff-add'> var screen = displayHeight(cm), result = {};</span> <span class='diff-add'> if (y2 - y1 > screen) y2 = y1 + screen;</span> <span class='diff-add'> var docBottom = cm.doc.height + paddingVert(display);</span> <span class='diff-add'> var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;</span> <span class='diff-add'> if (y1 < screentop) {</span> <span class='diff-add'> result.scrollTop = atTop ? 0 : y1;</span> <span class='diff-add'> } else if (y2 > screentop + screen) {</span> <span class='diff-add'> var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen);</span> <span class='diff-add'> if (newTop != screentop) result.scrollTop = newTop;</span> <span class='diff-add'> }</span> <span class='diff-add'> var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;</span> <span class='diff-add'> var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0);</span> <span class='diff-add'> var tooWide = x2 - x1 > screenw;</span> <span class='diff-add'> if (tooWide) x2 = x1 + screenw;</span> <span class='diff-add'> if (x1 < 10)</span> <span class='diff-add'> result.scrollLeft = 0;</span> <span class='diff-add'> else if (x1 < screenleft)</span> <span class='diff-add'> result.scrollLeft = Math.max(0, x1 - (tooWide ? 0 : 10));</span> <span class='diff-add'> else if (x2 > screenw + screenleft - 3)</span> <span class='diff-add'> result.scrollLeft = x2 + (tooWide ? 0 : 10) - screenw;</span> <span class='diff-add'> return result;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Store a relative adjustment to the scroll position in the current</span> <span class='diff-add'> // operation (to be applied when the operation finishes).</span> <span class='diff-add'> function addToScrollPos(cm, left, top) {</span> <span class='diff-add'> if (left != null || top != null) resolveScrollToPos(cm);</span> <span class='diff-add'> if (left != null)</span> <span class='diff-add'> cm.curOp.scrollLeft = (cm.curOp.scrollLeft == null ? cm.doc.scrollLeft : cm.curOp.scrollLeft) + left;</span> <span class='diff-add'> if (top != null)</span> <span class='diff-add'> cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Make sure that at the end of the operation the current cursor is</span> <span class='diff-add'> // shown.</span> <span class='diff-add'> function ensureCursorVisible(cm) {</span> <span class='diff-add'> resolveScrollToPos(cm);</span> <span class='diff-add'> var cur = cm.getCursor(), from = cur, to = cur;</span> <span class='diff-add'> if (!cm.options.lineWrapping) {</span> <span class='diff-add'> from = cur.ch ? Pos(cur.line, cur.ch - 1) : cur;</span> <span class='diff-add'> to = Pos(cur.line, cur.ch + 1);</span> <span class='diff-add'> }</span> <span class='diff-add'> cm.curOp.scrollToPos = {from: from, to: to, margin: cm.options.cursorScrollMargin, isCursor: true};</span> <span class='diff-add'> }</span> <span class='diff-add'> // When an operation has its scrollToPos property set, and another</span> <span class='diff-add'> // scroll action is applied before the end of the operation, this</span> <span class='diff-add'> // 'simulates' scrolling that position into view in a cheap way, so</span> <span class='diff-add'> // that the effect of intermediate scroll commands is not ignored.</span> <span class='diff-add'> function resolveScrollToPos(cm) {</span> <span class='diff-add'> var range = cm.curOp.scrollToPos;</span> <span class='diff-add'> if (range) {</span> <span class='diff-add'> cm.curOp.scrollToPos = null;</span> <span class='diff-add'> var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);</span> <span class='diff-add'> var sPos = calculateScrollPos(cm, Math.min(from.left, to.left),</span> <span class='diff-add'> Math.min(from.top, to.top) - range.margin,</span> <span class='diff-add'> Math.max(from.right, to.right),</span> <span class='diff-add'> Math.max(from.bottom, to.bottom) + range.margin);</span> <span class='diff-add'> cm.scrollTo(sPos.scrollLeft, sPos.scrollTop);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // API UTILITIES</span> <span class='diff-add'> // Indent the given line. The how parameter can be "smart",</span> <span class='diff-add'> // "add"/null, "subtract", or "prev". When aggressive is false</span> <span class='diff-add'> // (typically set to true for forced single-line indents), empty</span> <span class='diff-add'> // lines are not indented, and places where the mode returns Pass</span> <span class='diff-add'> // are left alone.</span> <span class='diff-add'> function indentLine(cm, n, how, aggressive) {</span> <span class='diff-add'> var doc = cm.doc, state;</span> <span class='diff-add'> if (how == null) how = "add";</span> <span class='diff-add'> if (how == "smart") {</span> <span class='diff-add'> // Fall back to "prev" when the mode doesn't have an indentation</span> <span class='diff-add'> // method.</span> <span class='diff-add'> if (!doc.mode.indent) how = "prev";</span> <span class='diff-add'> else state = getStateBefore(cm, n);</span> <span class='diff-add'> }</span> <span class='diff-add'> var tabSize = cm.options.tabSize;</span> <span class='diff-add'> var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);</span> <span class='diff-add'> if (line.stateAfter) line.stateAfter = null;</span> <span class='diff-add'> var curSpaceString = line.text.match(/^\s*/)[0], indentation;</span> <span class='diff-add'> if (!aggressive && !/\S/.test(line.text)) {</span> <span class='diff-add'> indentation = 0;</span> <span class='diff-add'> how = "not";</span> <span class='diff-add'> } else if (how == "smart") {</span> <span class='diff-add'> indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);</span> <span class='diff-add'> if (indentation == Pass || indentation > 150) {</span> <span class='diff-add'> if (!aggressive) return;</span> <span class='diff-add'> how = "prev";</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (how == "prev") {</span> <span class='diff-add'> if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize);</span> <span class='diff-add'> else indentation = 0;</span> <span class='diff-add'> } else if (how == "add") {</span> <span class='diff-add'> indentation = curSpace + cm.options.indentUnit;</span> <span class='diff-add'> } else if (how == "subtract") {</span> <span class='diff-add'> indentation = curSpace - cm.options.indentUnit;</span> <span class='diff-add'> } else if (typeof how == "number") {</span> <span class='diff-add'> indentation = curSpace + how;</span> <span class='diff-add'> }</span> <span class='diff-add'> indentation = Math.max(0, indentation);</span> <span class='diff-add'> var indentString = "", pos = 0;</span> <span class='diff-add'> if (cm.options.indentWithTabs)</span> <span class='diff-add'> for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";}</span> <span class='diff-add'> if (pos < indentation) indentString += spaceStr(indentation - pos);</span> <span class='diff-add'> if (indentString != curSpaceString) {</span> <span class='diff-add'> replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input");</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // Ensure that, if the cursor was in the whitespace at the start</span> <span class='diff-add'> // of the line, it is moved to the end of that space.</span> <span class='diff-add'> for (var i = 0; i < doc.sel.ranges.length; i++) {</span> <span class='diff-add'> var range = doc.sel.ranges[i];</span> <span class='diff-add'> if (range.head.line == n && range.head.ch < curSpaceString.length) {</span> <span class='diff-add'> var pos = Pos(n, curSpaceString.length);</span> <span class='diff-add'> replaceOneSelection(doc, i, new Range(pos, pos));</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> line.stateAfter = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Utility for applying a change to a line by handle or number,</span> <span class='diff-add'> // returning the number and optionally registering the line as</span> <span class='diff-add'> // changed.</span> <span class='diff-add'> function changeLine(doc, handle, changeType, op) {</span> <span class='diff-add'> var no = handle, line = handle;</span> <span class='diff-add'> if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle));</span> <span class='diff-add'> else no = lineNo(handle);</span> <span class='diff-add'> if (no == null) return null;</span> <span class='diff-add'> if (op(line, no) && doc.cm) regLineChange(doc.cm, no, changeType);</span> <span class='diff-add'> return line;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Helper for deleting text near the selection(s), used to implement</span> <span class='diff-add'> // backspace, delete, and similar functionality.</span> <span class='diff-add'> function deleteNearSelection(cm, compute) {</span> <span class='diff-add'> var ranges = cm.doc.sel.ranges, kill = [];</span> <span class='diff-add'> // Build up a set of ranges to kill first, merging overlapping</span> <span class='diff-add'> // ranges.</span> <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span> <span class='diff-add'> var toKill = compute(ranges[i]);</span> <span class='diff-add'> while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {</span> <span class='diff-add'> var replaced = kill.pop();</span> <span class='diff-add'> if (cmp(replaced.from, toKill.from) < 0) {</span> <span class='diff-add'> toKill.from = replaced.from;</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> kill.push(toKill);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Next, remove those actual ranges.</span> <span class='diff-add'> runInOp(cm, function() {</span> <span class='diff-add'> for (var i = kill.length - 1; i >= 0; i--)</span> <span class='diff-add'> replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete");</span> <span class='diff-add'> ensureCursorVisible(cm);</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> // Used for horizontal relative motion. Dir is -1 or 1 (left or</span> <span class='diff-add'> // right), unit can be "char", "column" (like char, but doesn't</span> <span class='diff-add'> // cross line boundaries), "word" (across next word), or "group" (to</span> <span class='diff-add'> // the start of next group of word or non-word-non-whitespace</span> <span class='diff-add'> // chars). The visually param controls whether, in right-to-left</span> <span class='diff-add'> // text, direction 1 means to move towards the next index in the</span> <span class='diff-add'> // string, or towards the character to the right of the current</span> <span class='diff-add'> // position. The resulting position will have a hitSide=true</span> <span class='diff-add'> // property if it reached the end of the document.</span> <span class='diff-add'> function findPosH(doc, pos, dir, unit, visually) {</span> <span class='diff-add'> var line = pos.line, ch = pos.ch, origDir = dir;</span> <span class='diff-add'> var lineObj = getLine(doc, line);</span> <span class='diff-add'> var possible = true;</span> <span class='diff-add'> function findNextLine() {</span> <span class='diff-add'> var l = line + dir;</span> <span class='diff-add'> if (l < doc.first || l >= doc.first + doc.size) return (possible = false);</span> <span class='diff-add'> line = l;</span> <span class='diff-add'> return lineObj = getLine(doc, l);</span> <span class='diff-add'> }</span> <span class='diff-add'> function moveOnce(boundToLine) {</span> <span class='diff-add'> var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true);</span> <span class='diff-add'> if (next == null) {</span> <span class='diff-add'> if (!boundToLine && findNextLine()) {</span> <span class='diff-add'> if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj);</span> <span class='diff-add'> else ch = dir < 0 ? lineObj.text.length : 0;</span> <span class='diff-add'> } else return (possible = false);</span> <span class='diff-add'> } else ch = next;</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (unit == "char") moveOnce();</span> <span class='diff-add'> else if (unit == "column") moveOnce(true);</span> <span class='diff-add'> else if (unit == "word" || unit == "group") {</span> <span class='diff-add'> var sawType = null, group = unit == "group";</span> <span class='diff-add'> var helper = doc.cm && doc.cm.getHelper(pos, "wordChars");</span> <span class='diff-add'> for (var first = true;; first = false) {</span> <span class='diff-add'> if (dir < 0 && !moveOnce(!first)) break;</span> <span class='diff-add'> var cur = lineObj.text.charAt(ch) || "\n";</span> <span class='diff-add'> var type = isWordChar(cur, helper) ? "w"</span> <span class='diff-add'> : group && cur == "\n" ? "n"</span> <span class='diff-add'> : !group || /\s/.test(cur) ? null</span> <span class='diff-add'> : "p";</span> <span class='diff-add'> if (group && !first && !type) type = "s";</span> <span class='diff-add'> if (sawType && sawType != type) {</span> <span class='diff-add'> if (dir < 0) {dir = 1; moveOnce();}</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (type) sawType = type;</span> <span class='diff-add'> if (dir > 0 && !moveOnce(!first)) break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> var result = skipAtomic(doc, Pos(line, ch), origDir, true);</span> <span class='diff-add'> if (!possible) result.hitSide = true;</span> <span class='diff-add'> return result;</span> <span class='diff-add'> }</span> <span class='diff-add'> // For relative vertical movement. Dir may be -1 or 1. Unit can be</span> <span class='diff-add'> // "page" or "line". The resulting position will have a hitSide=true</span> <span class='diff-add'> // property if it reached the end of the document.</span> <span class='diff-add'> function findPosV(cm, pos, dir, unit) {</span> <span class='diff-add'> var doc = cm.doc, x = pos.left, y;</span> <span class='diff-add'> if (unit == "page") {</span> <span class='diff-add'> var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);</span> <span class='diff-add'> y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display));</span> <span class='diff-add'> } else if (unit == "line") {</span> <span class='diff-add'> y = dir > 0 ? pos.bottom + 3 : pos.top - 3;</span> <span class='diff-add'> }</span> <span class='diff-add'> for (;;) {</span> <span class='diff-add'> var target = coordsChar(cm, x, y);</span> <span class='diff-add'> if (!target.outside) break;</span> <span class='diff-add'> if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; }</span> <span class='diff-add'> y += dir * 5;</span> <span class='diff-add'> }</span> <span class='diff-add'> return target;</span> <span class='diff-add'> }</span> <span class='diff-add'> // EDITOR METHODS</span> <span class='diff-add'> // The publicly visible API. Note that methodOp(f) means</span> <span class='diff-add'> // 'wrap f in an operation, performed on its `this` parameter'.</span> <span class='diff-add'> // This is not the complete set of editor methods. Most of the</span> <span class='diff-add'> // methods defined on the Doc type are also injected into</span> <span class='diff-add'> // CodeMirror.prototype, for backwards compatibility and</span> <span class='diff-add'> // convenience.</span> <span class='diff-add'> CodeMirror.prototype = {</span> <span class='diff-add'> constructor: CodeMirror,</span> <span class='diff-add'> focus: function(){window.focus(); focusInput(this); fastPoll(this);},</span> <span class='diff-add'> setOption: function(option, value) {</span> <span class='diff-add'> var options = this.options, old = options[option];</span> <span class='diff-add'> if (options[option] == value && option != "mode") return;</span> <span class='diff-add'> options[option] = value;</span> <span class='diff-add'> if (optionHandlers.hasOwnProperty(option))</span> <span class='diff-add'> operation(this, optionHandlers[option])(this, value, old);</span> <span class='diff-add'> },</span> <span class='diff-add'> getOption: function(option) {return this.options[option];},</span> <span class='diff-add'> getDoc: function() {return this.doc;},</span> <span class='diff-add'> addKeyMap: function(map, bottom) {</span> <span class='diff-add'> this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map));</span> <span class='diff-add'> },</span> <span class='diff-add'> removeKeyMap: function(map) {</span> <span class='diff-add'> var maps = this.state.keyMaps;</span> <span class='diff-add'> for (var i = 0; i < maps.length; ++i)</span> <span class='diff-add'> if (maps[i] == map || maps[i].name == map) {</span> <span class='diff-add'> maps.splice(i, 1);</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> addOverlay: methodOp(function(spec, options) {</span> <span class='diff-add'> var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);</span> <span class='diff-add'> if (mode.startState) throw new Error("Overlays may not be stateful.");</span> <span class='diff-add'> this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque});</span> <span class='diff-add'> this.state.modeGen++;</span> <span class='diff-add'> regChange(this);</span> <span class='diff-add'> }),</span> <span class='diff-add'> removeOverlay: methodOp(function(spec) {</span> <span class='diff-add'> var overlays = this.state.overlays;</span> <span class='diff-add'> for (var i = 0; i < overlays.length; ++i) {</span> <span class='diff-add'> var cur = overlays[i].modeSpec;</span> <span class='diff-add'> if (cur == spec || typeof spec == "string" && cur.name == spec) {</span> <span class='diff-add'> overlays.splice(i, 1);</span> <span class='diff-add'> this.state.modeGen++;</span> <span class='diff-add'> regChange(this);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }),</span> <span class='diff-add'> indentLine: methodOp(function(n, dir, aggressive) {</span> <span class='diff-add'> if (typeof dir != "string" && typeof dir != "number") {</span> <span class='diff-add'> if (dir == null) dir = this.options.smartIndent ? "smart" : "prev";</span> <span class='diff-add'> else dir = dir ? "add" : "subtract";</span> <span class='diff-add'> }</span> <span class='diff-add'> if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive);</span> <span class='diff-add'> }),</span> <span class='diff-add'> indentSelection: methodOp(function(how) {</span> <span class='diff-add'> var ranges = this.doc.sel.ranges, end = -1;</span> <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span> <span class='diff-add'> var range = ranges[i];</span> <span class='diff-add'> if (!range.empty()) {</span> <span class='diff-add'> var from = range.from(), to = range.to();</span> <span class='diff-add'> var start = Math.max(end, from.line);</span> <span class='diff-add'> end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;</span> <span class='diff-add'> for (var j = start; j < end; ++j)</span> <span class='diff-add'> indentLine(this, j, how);</span> <span class='diff-add'> var newRanges = this.doc.sel.ranges;</span> <span class='diff-add'> if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)</span> <span class='diff-add'> replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll);</span> <span class='diff-add'> } else if (range.head.line > end) {</span> <span class='diff-add'> indentLine(this, range.head.line, how, true);</span> <span class='diff-add'> end = range.head.line;</span> <span class='diff-add'> if (i == this.doc.sel.primIndex) ensureCursorVisible(this);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }),</span> <span class='diff-add'> // Fetch the parser token for a given character. Useful for hacks</span> <span class='diff-add'> // that want to inspect the mode state (say, for completion).</span> <span class='diff-add'> getTokenAt: function(pos, precise) {</span> <span class='diff-add'> return takeToken(this, pos, precise);</span> <span class='diff-add'> },</span> <span class='diff-add'> getLineTokens: function(line, precise) {</span> <span class='diff-add'> return takeToken(this, Pos(line), precise, true);</span> <span class='diff-add'> },</span> <span class='diff-add'> getTokenTypeAt: function(pos) {</span> <span class='diff-add'> pos = clipPos(this.doc, pos);</span> <span class='diff-add'> var styles = getLineStyles(this, getLine(this.doc, pos.line));</span> <span class='diff-add'> var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;</span> <span class='diff-add'> var type;</span> <span class='diff-add'> if (ch == 0) type = styles[2];</span> <span class='diff-add'> else for (;;) {</span> <span class='diff-add'> var mid = (before + after) >> 1;</span> <span class='diff-add'> if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;</span> <span class='diff-add'> else if (styles[mid * 2 + 1] < ch) before = mid + 1;</span> <span class='diff-add'> else { type = styles[mid * 2 + 2]; break; }</span> <span class='diff-add'> }</span> <span class='diff-add'> var cut = type ? type.indexOf("cm-overlay ") : -1;</span> <span class='diff-add'> return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1);</span> <span class='diff-add'> },</span> <span class='diff-add'> getModeAt: function(pos) {</span> <span class='diff-add'> var mode = this.doc.mode;</span> <span class='diff-add'> if (!mode.innerMode) return mode;</span> <span class='diff-add'> return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode;</span> <span class='diff-add'> },</span> <span class='diff-add'> getHelper: function(pos, type) {</span> <span class='diff-add'> return this.getHelpers(pos, type)[0];</span> <span class='diff-add'> },</span> <span class='diff-add'> getHelpers: function(pos, type) {</span> <span class='diff-add'> var found = [];</span> <span class='diff-add'> if (!helpers.hasOwnProperty(type)) return helpers;</span> <span class='diff-add'> var help = helpers[type], mode = this.getModeAt(pos);</span> <span class='diff-add'> if (typeof mode[type] == "string") {</span> <span class='diff-add'> if (help[mode[type]]) found.push(help[mode[type]]);</span> <span class='diff-add'> } else if (mode[type]) {</span> <span class='diff-add'> for (var i = 0; i < mode[type].length; i++) {</span> <span class='diff-add'> var val = help[mode[type][i]];</span> <span class='diff-add'> if (val) found.push(val);</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (mode.helperType && help[mode.helperType]) {</span> <span class='diff-add'> found.push(help[mode.helperType]);</span> <span class='diff-add'> } else if (help[mode.name]) {</span> <span class='diff-add'> found.push(help[mode.name]);</span> <span class='diff-add'> }</span> <span class='diff-add'> for (var i = 0; i < help._global.length; i++) {</span> <span class='diff-add'> var cur = help._global[i];</span> <span class='diff-add'> if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)</span> <span class='diff-add'> found.push(cur.val);</span> <span class='diff-add'> }</span> <span class='diff-add'> return found;</span> <span class='diff-add'> },</span> <span class='diff-add'> getStateAfter: function(line, precise) {</span> <span class='diff-add'> var doc = this.doc;</span> <span class='diff-add'> line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);</span> <span class='diff-add'> return getStateBefore(this, line + 1, precise);</span> <span class='diff-add'> },</span> <span class='diff-add'> cursorCoords: function(start, mode) {</span> <span class='diff-add'> var pos, range = this.doc.sel.primary();</span> <span class='diff-add'> if (start == null) pos = range.head;</span> <span class='diff-add'> else if (typeof start == "object") pos = clipPos(this.doc, start);</span> <span class='diff-add'> else pos = start ? range.from() : range.to();</span> <span class='diff-add'> return cursorCoords(this, pos, mode || "page");</span> <span class='diff-add'> },</span> <span class='diff-add'> charCoords: function(pos, mode) {</span> <span class='diff-add'> return charCoords(this, clipPos(this.doc, pos), mode || "page");</span> <span class='diff-add'> },</span> <span class='diff-add'> coordsChar: function(coords, mode) {</span> <span class='diff-add'> coords = fromCoordSystem(this, coords, mode || "page");</span> <span class='diff-add'> return coordsChar(this, coords.left, coords.top);</span> <span class='diff-add'> },</span> <span class='diff-add'> lineAtHeight: function(height, mode) {</span> <span class='diff-add'> height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top;</span> <span class='diff-add'> return lineAtHeight(this.doc, height + this.display.viewOffset);</span> <span class='diff-add'> },</span> <span class='diff-add'> heightAtLine: function(line, mode) {</span> <span class='diff-add'> var end = false, last = this.doc.first + this.doc.size - 1;</span> <span class='diff-add'> if (line < this.doc.first) line = this.doc.first;</span> <span class='diff-add'> else if (line > last) { line = last; end = true; }</span> <span class='diff-add'> var lineObj = getLine(this.doc, line);</span> <span class='diff-add'> return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page").top +</span> <span class='diff-add'> (end ? this.doc.height - heightAtLine(lineObj) : 0);</span> <span class='diff-add'> },</span> <span class='diff-add'> defaultTextHeight: function() { return textHeight(this.display); },</span> <span class='diff-add'> defaultCharWidth: function() { return charWidth(this.display); },</span> <span class='diff-add'> setGutterMarker: methodOp(function(line, gutterID, value) {</span> <span class='diff-add'> return changeLine(this.doc, line, "gutter", function(line) {</span> <span class='diff-add'> var markers = line.gutterMarkers || (line.gutterMarkers = {});</span> <span class='diff-add'> markers[gutterID] = value;</span> <span class='diff-add'> if (!value && isEmpty(markers)) line.gutterMarkers = null;</span> <span class='diff-add'> return true;</span> <span class='diff-add'> });</span> <span class='diff-add'> }),</span> <span class='diff-add'> clearGutter: methodOp(function(gutterID) {</span> <span class='diff-add'> var cm = this, doc = cm.doc, i = doc.first;</span> <span class='diff-add'> doc.iter(function(line) {</span> <span class='diff-add'> if (line.gutterMarkers && line.gutterMarkers[gutterID]) {</span> <span class='diff-add'> line.gutterMarkers[gutterID] = null;</span> <span class='diff-add'> regLineChange(cm, i, "gutter");</span> <span class='diff-add'> if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> ++i;</span> <span class='diff-add'> });</span> <span class='diff-add'> }),</span> <span class='diff-add'> addLineWidget: methodOp(function(handle, node, options) {</span> <span class='diff-add'> return addLineWidget(this, handle, node, options);</span> <span class='diff-add'> }),</span> <span class='diff-add'> removeLineWidget: function(widget) { widget.clear(); },</span> <span class='diff-add'> lineInfo: function(line) {</span> <span class='diff-add'> if (typeof line == "number") {</span> <span class='diff-add'> if (!isLine(this.doc, line)) return null;</span> <span class='diff-add'> var n = line;</span> <span class='diff-add'> line = getLine(this.doc, line);</span> <span class='diff-add'> if (!line) return null;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var n = lineNo(line);</span> <span class='diff-add'> if (n == null) return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,</span> <span class='diff-add'> textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,</span> <span class='diff-add'> widgets: line.widgets};</span> <span class='diff-add'> },</span> <span class='diff-add'> getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo};},</span> <span class='diff-add'> addWidget: function(pos, node, scroll, vert, horiz) {</span> <span class='diff-add'> var display = this.display;</span> <span class='diff-add'> pos = cursorCoords(this, clipPos(this.doc, pos));</span> <span class='diff-add'> var top = pos.bottom, left = pos.left;</span> <span class='diff-add'> node.style.position = "absolute";</span> <span class='diff-add'> node.setAttribute("cm-ignore-events", "true");</span> <span class='diff-add'> display.sizer.appendChild(node);</span> <span class='diff-add'> if (vert == "over") {</span> <span class='diff-add'> top = pos.top;</span> <span class='diff-add'> } else if (vert == "above" || vert == "near") {</span> <span class='diff-add'> var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),</span> <span class='diff-add'> hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);</span> <span class='diff-add'> // Default to positioning above (if specified and possible); otherwise default to positioning below</span> <span class='diff-add'> if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)</span> <span class='diff-add'> top = pos.top - node.offsetHeight;</span> <span class='diff-add'> else if (pos.bottom + node.offsetHeight <= vspace)</span> <span class='diff-add'> top = pos.bottom;</span> <span class='diff-add'> if (left + node.offsetWidth > hspace)</span> <span class='diff-add'> left = hspace - node.offsetWidth;</span> <span class='diff-add'> }</span> <span class='diff-add'> node.style.top = top + "px";</span> <span class='diff-add'> node.style.left = node.style.right = "";</span> <span class='diff-add'> if (horiz == "right") {</span> <span class='diff-add'> left = display.sizer.clientWidth - node.offsetWidth;</span> <span class='diff-add'> node.style.right = "0px";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> if (horiz == "left") left = 0;</span> <span class='diff-add'> else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2;</span> <span class='diff-add'> node.style.left = left + "px";</span> <span class='diff-add'> }</span> <span class='diff-add'> if (scroll)</span> <span class='diff-add'> scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight);</span> <span class='diff-add'> },</span> <span class='diff-add'> triggerOnKeyDown: methodOp(onKeyDown),</span> <span class='diff-add'> triggerOnKeyPress: methodOp(onKeyPress),</span> <span class='diff-add'> triggerOnKeyUp: onKeyUp,</span> <span class='diff-add'> execCommand: function(cmd) {</span> <span class='diff-add'> if (commands.hasOwnProperty(cmd))</span> <span class='diff-add'> return commands[cmd](this);</span> <span class='diff-add'> },</span> <span class='diff-add'> findPosH: function(from, amount, unit, visually) {</span> <span class='diff-add'> var dir = 1;</span> <span class='diff-add'> if (amount < 0) { dir = -1; amount = -amount; }</span> <span class='diff-add'> for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {</span> <span class='diff-add'> cur = findPosH(this.doc, cur, dir, unit, visually);</span> <span class='diff-add'> if (cur.hitSide) break;</span> <span class='diff-add'> }</span> <span class='diff-add'> return cur;</span> <span class='diff-add'> },</span> <span class='diff-add'> moveH: methodOp(function(dir, unit) {</span> <span class='diff-add'> var cm = this;</span> <span class='diff-add'> cm.extendSelectionsBy(function(range) {</span> <span class='diff-add'> if (cm.display.shift || cm.doc.extend || range.empty())</span> <span class='diff-add'> return findPosH(cm.doc, range.head, dir, unit, cm.options.rtlMoveVisually);</span> <span class='diff-add'> else</span> <span class='diff-add'> return dir < 0 ? range.from() : range.to();</span> <span class='diff-add'> }, sel_move);</span> <span class='diff-add'> }),</span> <span class='diff-add'> deleteH: methodOp(function(dir, unit) {</span> <span class='diff-add'> var sel = this.doc.sel, doc = this.doc;</span> <span class='diff-add'> if (sel.somethingSelected())</span> <span class='diff-add'> doc.replaceSelection("", null, "+delete");</span> <span class='diff-add'> else</span> <span class='diff-add'> deleteNearSelection(this, function(range) {</span> <span class='diff-add'> var other = findPosH(doc, range.head, dir, unit, false);</span> <span class='diff-add'> return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other};</span> <span class='diff-add'> });</span> <span class='diff-add'> }),</span> <span class='diff-add'> findPosV: function(from, amount, unit, goalColumn) {</span> <span class='diff-add'> var dir = 1, x = goalColumn;</span> <span class='diff-add'> if (amount < 0) { dir = -1; amount = -amount; }</span> <span class='diff-add'> for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {</span> <span class='diff-add'> var coords = cursorCoords(this, cur, "div");</span> <span class='diff-add'> if (x == null) x = coords.left;</span> <span class='diff-add'> else coords.left = x;</span> <span class='diff-add'> cur = findPosV(this, coords, dir, unit);</span> <span class='diff-add'> if (cur.hitSide) break;</span> <span class='diff-add'> }</span> <span class='diff-add'> return cur;</span> <span class='diff-add'> },</span> <span class='diff-add'> moveV: methodOp(function(dir, unit) {</span> <span class='diff-add'> var cm = this, doc = this.doc, goals = [];</span> <span class='diff-add'> var collapse = !cm.display.shift && !doc.extend && doc.sel.somethingSelected();</span> <span class='diff-add'> doc.extendSelectionsBy(function(range) {</span> <span class='diff-add'> if (collapse)</span> <span class='diff-add'> return dir < 0 ? range.from() : range.to();</span> <span class='diff-add'> var headPos = cursorCoords(cm, range.head, "div");</span> <span class='diff-add'> if (range.goalColumn != null) headPos.left = range.goalColumn;</span> <span class='diff-add'> goals.push(headPos.left);</span> <span class='diff-add'> var pos = findPosV(cm, headPos, dir, unit);</span> <span class='diff-add'> if (unit == "page" && range == doc.sel.primary())</span> <span class='diff-add'> addToScrollPos(cm, null, charCoords(cm, pos, "div").top - headPos.top);</span> <span class='diff-add'> return pos;</span> <span class='diff-add'> }, sel_move);</span> <span class='diff-add'> if (goals.length) for (var i = 0; i < doc.sel.ranges.length; i++)</span> <span class='diff-add'> doc.sel.ranges[i].goalColumn = goals[i];</span> <span class='diff-add'> }),</span> <span class='diff-add'> // Find the word at the given position (as returned by coordsChar).</span> <span class='diff-add'> findWordAt: function(pos) {</span> <span class='diff-add'> var doc = this.doc, line = getLine(doc, pos.line).text;</span> <span class='diff-add'> var start = pos.ch, end = pos.ch;</span> <span class='diff-add'> if (line) {</span> <span class='diff-add'> var helper = this.getHelper(pos, "wordChars");</span> <span class='diff-add'> if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;</span> <span class='diff-add'> var startChar = line.charAt(start);</span> <span class='diff-add'> var check = isWordChar(startChar, helper)</span> <span class='diff-add'> ? function(ch) { return isWordChar(ch, helper); }</span> <span class='diff-add'> : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);}</span> <span class='diff-add'> : function(ch) {return !/\s/.test(ch) && !isWordChar(ch);};</span> <span class='diff-add'> while (start > 0 && check(line.charAt(start - 1))) --start;</span> <span class='diff-add'> while (end < line.length && check(line.charAt(end))) ++end;</span> <span class='diff-add'> }</span> <span class='diff-add'> return new Range(Pos(pos.line, start), Pos(pos.line, end));</span> <span class='diff-add'> },</span> <span class='diff-add'> toggleOverwrite: function(value) {</span> <span class='diff-add'> if (value != null && value == this.state.overwrite) return;</span> <span class='diff-add'> if (this.state.overwrite = !this.state.overwrite)</span> <span class='diff-add'> addClass(this.display.cursorDiv, "CodeMirror-overwrite");</span> <span class='diff-add'> else</span> <span class='diff-add'> rmClass(this.display.cursorDiv, "CodeMirror-overwrite");</span> <span class='diff-add'> signal(this, "overwriteToggle", this, this.state.overwrite);</span> <span class='diff-add'> },</span> <span class='diff-add'> hasFocus: function() { return activeElt() == this.display.input; },</span> <span class='diff-add'> scrollTo: methodOp(function(x, y) {</span> <span class='diff-add'> if (x != null || y != null) resolveScrollToPos(this);</span> <span class='diff-add'> if (x != null) this.curOp.scrollLeft = x;</span> <span class='diff-add'> if (y != null) this.curOp.scrollTop = y;</span> <span class='diff-add'> }),</span> <span class='diff-add'> getScrollInfo: function() {</span> <span class='diff-add'> var scroller = this.display.scroller;</span> <span class='diff-add'> return {left: scroller.scrollLeft, top: scroller.scrollTop,</span> <span class='diff-add'> height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,</span> <span class='diff-add'> width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,</span> <span class='diff-add'> clientHeight: displayHeight(this), clientWidth: displayWidth(this)};</span> <span class='diff-add'> },</span> <span class='diff-add'> scrollIntoView: methodOp(function(range, margin) {</span> <span class='diff-add'> if (range == null) {</span> <span class='diff-add'> range = {from: this.doc.sel.primary().head, to: null};</span> <span class='diff-add'> if (margin == null) margin = this.options.cursorScrollMargin;</span> <span class='diff-add'> } else if (typeof range == "number") {</span> <span class='diff-add'> range = {from: Pos(range, 0), to: null};</span> <span class='diff-add'> } else if (range.from == null) {</span> <span class='diff-add'> range = {from: range, to: null};</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!range.to) range.to = range.from;</span> <span class='diff-add'> range.margin = margin || 0;</span> <span class='diff-add'> if (range.from.line != null) {</span> <span class='diff-add'> resolveScrollToPos(this);</span> <span class='diff-add'> this.curOp.scrollToPos = range;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var sPos = calculateScrollPos(this, Math.min(range.from.left, range.to.left),</span> <span class='diff-add'> Math.min(range.from.top, range.to.top) - range.margin,</span> <span class='diff-add'> Math.max(range.from.right, range.to.right),</span> <span class='diff-add'> Math.max(range.from.bottom, range.to.bottom) + range.margin);</span> <span class='diff-add'> this.scrollTo(sPos.scrollLeft, sPos.scrollTop);</span> <span class='diff-add'> }</span> <span class='diff-add'> }),</span> <span class='diff-add'> setSize: methodOp(function(width, height) {</span> <span class='diff-add'> var cm = this;</span> <span class='diff-add'> function interpret(val) {</span> <span class='diff-add'> return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (width != null) cm.display.wrapper.style.width = interpret(width);</span> <span class='diff-add'> if (height != null) cm.display.wrapper.style.height = interpret(height);</span> <span class='diff-add'> if (cm.options.lineWrapping) clearLineMeasurementCache(this);</span> <span class='diff-add'> var lineNo = cm.display.viewFrom;</span> <span class='diff-add'> cm.doc.iter(lineNo, cm.display.viewTo, function(line) {</span> <span class='diff-add'> if (line.widgets) for (var i = 0; i < line.widgets.length; i++)</span> <span class='diff-add'> if (line.widgets[i].noHScroll) { regLineChange(cm, lineNo, "widget"); break; }</span> <span class='diff-add'> ++lineNo;</span> <span class='diff-add'> });</span> <span class='diff-add'> cm.curOp.forceUpdate = true;</span> <span class='diff-add'> signal(cm, "refresh", this);</span> <span class='diff-add'> }),</span> <span class='diff-add'> operation: function(f){return runInOp(this, f);},</span> <span class='diff-add'> refresh: methodOp(function() {</span> <span class='diff-add'> var oldHeight = this.display.cachedTextHeight;</span> <span class='diff-add'> regChange(this);</span> <span class='diff-add'> this.curOp.forceUpdate = true;</span> <span class='diff-add'> clearCaches(this);</span> <span class='diff-add'> this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop);</span> <span class='diff-add'> updateGutterSpace(this);</span> <span class='diff-add'> if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)</span> <span class='diff-add'> estimateLineHeights(this);</span> <span class='diff-add'> signal(this, "refresh", this);</span> <span class='diff-add'> }),</span> <span class='diff-add'> swapDoc: methodOp(function(doc) {</span> <span class='diff-add'> var old = this.doc;</span> <span class='diff-add'> old.cm = null;</span> <span class='diff-add'> attachDoc(this, doc);</span> <span class='diff-add'> clearCaches(this);</span> <span class='diff-add'> resetInput(this);</span> <span class='diff-add'> this.scrollTo(doc.scrollLeft, doc.scrollTop);</span> <span class='diff-add'> this.curOp.forceScroll = true;</span> <span class='diff-add'> signalLater(this, "swapDoc", this, old);</span> <span class='diff-add'> return old;</span> <span class='diff-add'> }),</span> <span class='diff-add'> getInputField: function(){return this.display.input;},</span> <span class='diff-add'> getWrapperElement: function(){return this.display.wrapper;},</span> <span class='diff-add'> getScrollerElement: function(){return this.display.scroller;},</span> <span class='diff-add'> getGutterElement: function(){return this.display.gutters;}</span> <span class='diff-add'> };</span> <span class='diff-add'> eventMixin(CodeMirror);</span> <span class='diff-add'> // OPTION DEFAULTS</span> <span class='diff-add'> // The default configuration options.</span> <span class='diff-add'> var defaults = CodeMirror.defaults = {};</span> <span class='diff-add'> // Functions to run when options are changed.</span> <span class='diff-add'> var optionHandlers = CodeMirror.optionHandlers = {};</span> <span class='diff-add'> function option(name, deflt, handle, notOnInit) {</span> <span class='diff-add'> CodeMirror.defaults[name] = deflt;</span> <span class='diff-add'> if (handle) optionHandlers[name] =</span> <span class='diff-add'> notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Passed to option handlers when there is no old value.</span> <span class='diff-add'> var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}};</span> <span class='diff-add'> // These two are, on init, called from the constructor because they</span> <span class='diff-add'> // have to be initialized before the editor can start at all.</span> <span class='diff-add'> option("value", "", function(cm, val) {</span> <span class='diff-add'> cm.setValue(val);</span> <span class='diff-add'> }, true);</span> <span class='diff-add'> option("mode", null, function(cm, val) {</span> <span class='diff-add'> cm.doc.modeOption = val;</span> <span class='diff-add'> loadMode(cm);</span> <span class='diff-add'> }, true);</span> <span class='diff-add'> option("indentUnit", 2, loadMode, true);</span> <span class='diff-add'> option("indentWithTabs", false);</span> <span class='diff-add'> option("smartIndent", true);</span> <span class='diff-add'> option("tabSize", 4, function(cm) {</span> <span class='diff-add'> resetModeState(cm);</span> <span class='diff-add'> clearCaches(cm);</span> <span class='diff-add'> regChange(cm);</span> <span class='diff-add'> }, true);</span> <span class='diff-add'> option("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(cm, val) {</span> <span class='diff-add'> cm.options.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");</span> <span class='diff-add'> cm.refresh();</span> <span class='diff-add'> }, true);</span> <span class='diff-add'> option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function(cm) {cm.refresh();}, true);</span> <span class='diff-add'> option("electricChars", true);</span> <span class='diff-add'> option("rtlMoveVisually", !windows);</span> <span class='diff-add'> option("wholeLineUpdateBefore", true);</span> <span class='diff-add'> option("theme", "default", function(cm) {</span> <span class='diff-add'> themeChanged(cm);</span> <span class='diff-add'> guttersChanged(cm);</span> <span class='diff-add'> }, true);</span> <span class='diff-add'> option("keyMap", "default", function(cm, val, old) {</span> <span class='diff-add'> var next = getKeyMap(val);</span> <span class='diff-add'> var prev = old != CodeMirror.Init && getKeyMap(old);</span> <span class='diff-add'> if (prev && prev.detach) prev.detach(cm, next);</span> <span class='diff-add'> if (next.attach) next.attach(cm, prev || null);</span> <span class='diff-add'> });</span> <span class='diff-add'> option("extraKeys", null);</span> <span class='diff-add'> option("lineWrapping", false, wrappingChanged, true);</span> <span class='diff-add'> option("gutters", [], function(cm) {</span> <span class='diff-add'> setGuttersForLineNumbers(cm.options);</span> <span class='diff-add'> guttersChanged(cm);</span> <span class='diff-add'> }, true);</span> <span class='diff-add'> option("fixedGutter", true, function(cm, val) {</span> <span class='diff-add'> cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0";</span> <span class='diff-add'> cm.refresh();</span> <span class='diff-add'> }, true);</span> <span class='diff-add'> option("coverGutterNextToScrollbar", false, function(cm) {updateScrollbars(cm);}, true);</span> <span class='diff-add'> option("scrollbarStyle", "native", function(cm) {</span> <span class='diff-add'> initScrollbars(cm);</span> <span class='diff-add'> updateScrollbars(cm);</span> <span class='diff-add'> cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);</span> <span class='diff-add'> cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);</span> <span class='diff-add'> }, true);</span> <span class='diff-add'> option("lineNumbers", false, function(cm) {</span> <span class='diff-add'> setGuttersForLineNumbers(cm.options);</span> <span class='diff-add'> guttersChanged(cm);</span> <span class='diff-add'> }, true);</span> <span class='diff-add'> option("firstLineNumber", 1, guttersChanged, true);</span> <span class='diff-add'> option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true);</span> <span class='diff-add'> option("showCursorWhenSelecting", false, updateSelection, true);</span> <span class='diff-add'> option("resetSelectionOnContextMenu", true);</span> <span class='diff-add'> option("readOnly", false, function(cm, val) {</span> <span class='diff-add'> if (val == "nocursor") {</span> <span class='diff-add'> onBlur(cm);</span> <span class='diff-add'> cm.display.input.blur();</span> <span class='diff-add'> cm.display.disabled = true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> cm.display.disabled = false;</span> <span class='diff-add'> if (!val) resetInput(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> option("disableInput", false, function(cm, val) {if (!val) resetInput(cm);}, true);</span> <span class='diff-add'> option("dragDrop", true);</span> <span class='diff-add'> option("cursorBlinkRate", 530);</span> <span class='diff-add'> option("cursorScrollMargin", 0);</span> <span class='diff-add'> option("cursorHeight", 1, updateSelection, true);</span> <span class='diff-add'> option("singleCursorHeightPerLine", true, updateSelection, true);</span> <span class='diff-add'> option("workTime", 100);</span> <span class='diff-add'> option("workDelay", 100);</span> <span class='diff-add'> option("flattenSpans", true, resetModeState, true);</span> <span class='diff-add'> option("addModeClass", false, resetModeState, true);</span> <span class='diff-add'> option("pollInterval", 100);</span> <span class='diff-add'> option("undoDepth", 200, function(cm, val){cm.doc.history.undoDepth = val;});</span> <span class='diff-add'> option("historyEventDelay", 1250);</span> <span class='diff-add'> option("viewportMargin", 10, function(cm){cm.refresh();}, true);</span> <span class='diff-add'> option("maxHighlightLength", 10000, resetModeState, true);</span> <span class='diff-add'> option("moveInputWithCursor", true, function(cm, val) {</span> <span class='diff-add'> if (!val) cm.display.inputDiv.style.top = cm.display.inputDiv.style.left = 0;</span> <span class='diff-add'> });</span> <span class='diff-add'> option("tabindex", null, function(cm, val) {</span> <span class='diff-add'> cm.display.input.tabIndex = val || "";</span> <span class='diff-add'> });</span> <span class='diff-add'> option("autofocus", null);</span> <span class='diff-add'> // MODE DEFINITION AND QUERYING</span> <span class='diff-add'> // Known modes, by name and by MIME</span> <span class='diff-add'> var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};</span> <span class='diff-add'> // Extra arguments are stored as the mode's dependencies, which is</span> <span class='diff-add'> // used by (legacy) mechanisms like loadmode.js to automatically</span> <span class='diff-add'> // load a mode. (Preferred mechanism is the require/define calls.)</span> <span class='diff-add'> CodeMirror.defineMode = function(name, mode) {</span> <span class='diff-add'> if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;</span> <span class='diff-add'> if (arguments.length > 2)</span> <span class='diff-add'> mode.dependencies = Array.prototype.slice.call(arguments, 2);</span> <span class='diff-add'> modes[name] = mode;</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeMirror.defineMIME = function(mime, spec) {</span> <span class='diff-add'> mimeModes[mime] = spec;</span> <span class='diff-add'> };</span> <span class='diff-add'> // Given a MIME type, a {name, ...options} config object, or a name</span> <span class='diff-add'> // string, return a mode config object.</span> <span class='diff-add'> CodeMirror.resolveMode = function(spec) {</span> <span class='diff-add'> if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {</span> <span class='diff-add'> spec = mimeModes[spec];</span> <span class='diff-add'> } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {</span> <span class='diff-add'> var found = mimeModes[spec.name];</span> <span class='diff-add'> if (typeof found == "string") found = {name: found};</span> <span class='diff-add'> spec = createObj(found, spec);</span> <span class='diff-add'> spec.name = found.name;</span> <span class='diff-add'> } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {</span> <span class='diff-add'> return CodeMirror.resolveMode("application/xml");</span> <span class='diff-add'> }</span> <span class='diff-add'> if (typeof spec == "string") return {name: spec};</span> <span class='diff-add'> else return spec || {name: "null"};</span> <span class='diff-add'> };</span> <span class='diff-add'> // Given a mode spec (anything that resolveMode accepts), find and</span> <span class='diff-add'> // initialize an actual mode object.</span> <span class='diff-add'> CodeMirror.getMode = function(options, spec) {</span> <span class='diff-add'> var spec = CodeMirror.resolveMode(spec);</span> <span class='diff-add'> var mfactory = modes[spec.name];</span> <span class='diff-add'> if (!mfactory) return CodeMirror.getMode(options, "text/plain");</span> <span class='diff-add'> var modeObj = mfactory(options, spec);</span> <span class='diff-add'> if (modeExtensions.hasOwnProperty(spec.name)) {</span> <span class='diff-add'> var exts = modeExtensions[spec.name];</span> <span class='diff-add'> for (var prop in exts) {</span> <span class='diff-add'> if (!exts.hasOwnProperty(prop)) continue;</span> <span class='diff-add'> if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop];</span> <span class='diff-add'> modeObj[prop] = exts[prop];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> modeObj.name = spec.name;</span> <span class='diff-add'> if (spec.helperType) modeObj.helperType = spec.helperType;</span> <span class='diff-add'> if (spec.modeProps) for (var prop in spec.modeProps)</span> <span class='diff-add'> modeObj[prop] = spec.modeProps[prop];</span> <span class='diff-add'> return modeObj;</span> <span class='diff-add'> };</span> <span class='diff-add'> // Minimal default mode.</span> <span class='diff-add'> CodeMirror.defineMode("null", function() {</span> <span class='diff-add'> return {token: function(stream) {stream.skipToEnd();}};</span> <span class='diff-add'> });</span> <span class='diff-add'> CodeMirror.defineMIME("text/plain", "null");</span> <span class='diff-add'> // This can be used to attach properties to mode objects from</span> <span class='diff-add'> // outside the actual mode definition.</span> <span class='diff-add'> var modeExtensions = CodeMirror.modeExtensions = {};</span> <span class='diff-add'> CodeMirror.extendMode = function(mode, properties) {</span> <span class='diff-add'> var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});</span> <span class='diff-add'> copyObj(properties, exts);</span> <span class='diff-add'> };</span> <span class='diff-add'> // EXTENSIONS</span> <span class='diff-add'> CodeMirror.defineExtension = function(name, func) {</span> <span class='diff-add'> CodeMirror.prototype[name] = func;</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeMirror.defineDocExtension = function(name, func) {</span> <span class='diff-add'> Doc.prototype[name] = func;</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeMirror.defineOption = option;</span> <span class='diff-add'> var initHooks = [];</span> <span class='diff-add'> CodeMirror.defineInitHook = function(f) {initHooks.push(f);};</span> <span class='diff-add'> var helpers = CodeMirror.helpers = {};</span> <span class='diff-add'> CodeMirror.registerHelper = function(type, name, value) {</span> <span class='diff-add'> if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []};</span> <span class='diff-add'> helpers[type][name] = value;</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {</span> <span class='diff-add'> CodeMirror.registerHelper(type, name, value);</span> <span class='diff-add'> helpers[type]._global.push({pred: predicate, val: value});</span> <span class='diff-add'> };</span> <span class='diff-add'> // MODE STATE HANDLING</span> <span class='diff-add'> // Utility functions for working with state. Exported because nested</span> <span class='diff-add'> // modes need to do this for their inner modes.</span> <span class='diff-add'> var copyState = CodeMirror.copyState = function(mode, state) {</span> <span class='diff-add'> if (state === true) return state;</span> <span class='diff-add'> if (mode.copyState) return mode.copyState(state);</span> <span class='diff-add'> var nstate = {};</span> <span class='diff-add'> for (var n in state) {</span> <span class='diff-add'> var val = state[n];</span> <span class='diff-add'> if (val instanceof Array) val = val.concat([]);</span> <span class='diff-add'> nstate[n] = val;</span> <span class='diff-add'> }</span> <span class='diff-add'> return nstate;</span> <span class='diff-add'> };</span> <span class='diff-add'> var startState = CodeMirror.startState = function(mode, a1, a2) {</span> <span class='diff-add'> return mode.startState ? mode.startState(a1, a2) : true;</span> <span class='diff-add'> };</span> <span class='diff-add'> // Given a mode and a state (for that mode), find the inner mode and</span> <span class='diff-add'> // state at the position that the state refers to.</span> <span class='diff-add'> CodeMirror.innerMode = function(mode, state) {</span> <span class='diff-add'> while (mode.innerMode) {</span> <span class='diff-add'> var info = mode.innerMode(state);</span> <span class='diff-add'> if (!info || info.mode == mode) break;</span> <span class='diff-add'> state = info.state;</span> <span class='diff-add'> mode = info.mode;</span> <span class='diff-add'> }</span> <span class='diff-add'> return info || {mode: mode, state: state};</span> <span class='diff-add'> };</span> <span class='diff-add'> // STANDARD COMMANDS</span> <span class='diff-add'> // Commands are parameter-less actions that can be performed on an</span> <span class='diff-add'> // editor, mostly used for keybindings.</span> <span class='diff-add'> var commands = CodeMirror.commands = {</span> <span class='diff-add'> selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);},</span> <span class='diff-add'> singleSelection: function(cm) {</span> <span class='diff-add'> cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll);</span> <span class='diff-add'> },</span> <span class='diff-add'> killLine: function(cm) {</span> <span class='diff-add'> deleteNearSelection(cm, function(range) {</span> <span class='diff-add'> if (range.empty()) {</span> <span class='diff-add'> var len = getLine(cm.doc, range.head.line).text.length;</span> <span class='diff-add'> if (range.head.ch == len && range.head.line < cm.lastLine())</span> <span class='diff-add'> return {from: range.head, to: Pos(range.head.line + 1, 0)};</span> <span class='diff-add'> else</span> <span class='diff-add'> return {from: range.head, to: Pos(range.head.line, len)};</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return {from: range.from(), to: range.to()};</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> },</span> <span class='diff-add'> deleteLine: function(cm) {</span> <span class='diff-add'> deleteNearSelection(cm, function(range) {</span> <span class='diff-add'> return {from: Pos(range.from().line, 0),</span> <span class='diff-add'> to: clipPos(cm.doc, Pos(range.to().line + 1, 0))};</span> <span class='diff-add'> });</span> <span class='diff-add'> },</span> <span class='diff-add'> delLineLeft: function(cm) {</span> <span class='diff-add'> deleteNearSelection(cm, function(range) {</span> <span class='diff-add'> return {from: Pos(range.from().line, 0), to: range.from()};</span> <span class='diff-add'> });</span> <span class='diff-add'> },</span> <span class='diff-add'> delWrappedLineLeft: function(cm) {</span> <span class='diff-add'> deleteNearSelection(cm, function(range) {</span> <span class='diff-add'> var top = cm.charCoords(range.head, "div").top + 5;</span> <span class='diff-add'> var leftPos = cm.coordsChar({left: 0, top: top}, "div");</span> <span class='diff-add'> return {from: leftPos, to: range.from()};</span> <span class='diff-add'> });</span> <span class='diff-add'> },</span> <span class='diff-add'> delWrappedLineRight: function(cm) {</span> <span class='diff-add'> deleteNearSelection(cm, function(range) {</span> <span class='diff-add'> var top = cm.charCoords(range.head, "div").top + 5;</span> <span class='diff-add'> var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");</span> <span class='diff-add'> return {from: range.from(), to: rightPos };</span> <span class='diff-add'> });</span> <span class='diff-add'> },</span> <span class='diff-add'> undo: function(cm) {cm.undo();},</span> <span class='diff-add'> redo: function(cm) {cm.redo();},</span> <span class='diff-add'> undoSelection: function(cm) {cm.undoSelection();},</span> <span class='diff-add'> redoSelection: function(cm) {cm.redoSelection();},</span> <span class='diff-add'> goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},</span> <span class='diff-add'> goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));},</span> <span class='diff-add'> goLineStart: function(cm) {</span> <span class='diff-add'> cm.extendSelectionsBy(function(range) { return lineStart(cm, range.head.line); },</span> <span class='diff-add'> {origin: "+move", bias: 1});</span> <span class='diff-add'> },</span> <span class='diff-add'> goLineStartSmart: function(cm) {</span> <span class='diff-add'> cm.extendSelectionsBy(function(range) {</span> <span class='diff-add'> return lineStartSmart(cm, range.head);</span> <span class='diff-add'> }, {origin: "+move", bias: 1});</span> <span class='diff-add'> },</span> <span class='diff-add'> goLineEnd: function(cm) {</span> <span class='diff-add'> cm.extendSelectionsBy(function(range) { return lineEnd(cm, range.head.line); },</span> <span class='diff-add'> {origin: "+move", bias: -1});</span> <span class='diff-add'> },</span> <span class='diff-add'> goLineRight: function(cm) {</span> <span class='diff-add'> cm.extendSelectionsBy(function(range) {</span> <span class='diff-add'> var top = cm.charCoords(range.head, "div").top + 5;</span> <span class='diff-add'> return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");</span> <span class='diff-add'> }, sel_move);</span> <span class='diff-add'> },</span> <span class='diff-add'> goLineLeft: function(cm) {</span> <span class='diff-add'> cm.extendSelectionsBy(function(range) {</span> <span class='diff-add'> var top = cm.charCoords(range.head, "div").top + 5;</span> <span class='diff-add'> return cm.coordsChar({left: 0, top: top}, "div");</span> <span class='diff-add'> }, sel_move);</span> <span class='diff-add'> },</span> <span class='diff-add'> goLineLeftSmart: function(cm) {</span> <span class='diff-add'> cm.extendSelectionsBy(function(range) {</span> <span class='diff-add'> var top = cm.charCoords(range.head, "div").top + 5;</span> <span class='diff-add'> var pos = cm.coordsChar({left: 0, top: top}, "div");</span> <span class='diff-add'> if (pos.ch < cm.getLine(pos.line).search(/\S/)) return lineStartSmart(cm, range.head);</span> <span class='diff-add'> return pos;</span> <span class='diff-add'> }, sel_move);</span> <span class='diff-add'> },</span> <span class='diff-add'> goLineUp: function(cm) {cm.moveV(-1, "line");},</span> <span class='diff-add'> goLineDown: function(cm) {cm.moveV(1, "line");},</span> <span class='diff-add'> goPageUp: function(cm) {cm.moveV(-1, "page");},</span> <span class='diff-add'> goPageDown: function(cm) {cm.moveV(1, "page");},</span> <span class='diff-add'> goCharLeft: function(cm) {cm.moveH(-1, "char");},</span> <span class='diff-add'> goCharRight: function(cm) {cm.moveH(1, "char");},</span> <span class='diff-add'> goColumnLeft: function(cm) {cm.moveH(-1, "column");},</span> <span class='diff-add'> goColumnRight: function(cm) {cm.moveH(1, "column");},</span> <span class='diff-add'> goWordLeft: function(cm) {cm.moveH(-1, "word");},</span> <span class='diff-add'> goGroupRight: function(cm) {cm.moveH(1, "group");},</span> <span class='diff-add'> goGroupLeft: function(cm) {cm.moveH(-1, "group");},</span> <span class='diff-add'> goWordRight: function(cm) {cm.moveH(1, "word");},</span> <span class='diff-add'> delCharBefore: function(cm) {cm.deleteH(-1, "char");},</span> <span class='diff-add'> delCharAfter: function(cm) {cm.deleteH(1, "char");},</span> <span class='diff-add'> delWordBefore: function(cm) {cm.deleteH(-1, "word");},</span> <span class='diff-add'> delWordAfter: function(cm) {cm.deleteH(1, "word");},</span> <span class='diff-add'> delGroupBefore: function(cm) {cm.deleteH(-1, "group");},</span> <span class='diff-add'> delGroupAfter: function(cm) {cm.deleteH(1, "group");},</span> <span class='diff-add'> indentAuto: function(cm) {cm.indentSelection("smart");},</span> <span class='diff-add'> indentMore: function(cm) {cm.indentSelection("add");},</span> <span class='diff-add'> indentLess: function(cm) {cm.indentSelection("subtract");},</span> <span class='diff-add'> insertTab: function(cm) {cm.replaceSelection("\t");},</span> <span class='diff-add'> insertSoftTab: function(cm) {</span> <span class='diff-add'> var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;</span> <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span> <span class='diff-add'> var pos = ranges[i].from();</span> <span class='diff-add'> var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);</span> <span class='diff-add'> spaces.push(new Array(tabSize - col % tabSize + 1).join(" "));</span> <span class='diff-add'> }</span> <span class='diff-add'> cm.replaceSelections(spaces);</span> <span class='diff-add'> },</span> <span class='diff-add'> defaultTab: function(cm) {</span> <span class='diff-add'> if (cm.somethingSelected()) cm.indentSelection("add");</span> <span class='diff-add'> else cm.execCommand("insertTab");</span> <span class='diff-add'> },</span> <span class='diff-add'> transposeChars: function(cm) {</span> <span class='diff-add'> runInOp(cm, function() {</span> <span class='diff-add'> var ranges = cm.listSelections(), newSel = [];</span> <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span> <span class='diff-add'> var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;</span> <span class='diff-add'> if (line) {</span> <span class='diff-add'> if (cur.ch == line.length) cur = new Pos(cur.line, cur.ch - 1);</span> <span class='diff-add'> if (cur.ch > 0) {</span> <span class='diff-add'> cur = new Pos(cur.line, cur.ch + 1);</span> <span class='diff-add'> cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),</span> <span class='diff-add'> Pos(cur.line, cur.ch - 2), cur, "+transpose");</span> <span class='diff-add'> } else if (cur.line > cm.doc.first) {</span> <span class='diff-add'> var prev = getLine(cm.doc, cur.line - 1).text;</span> <span class='diff-add'> if (prev)</span> <span class='diff-add'> cm.replaceRange(line.charAt(0) + "\n" + prev.charAt(prev.length - 1),</span> <span class='diff-add'> Pos(cur.line - 1, prev.length - 1), Pos(cur.line, 1), "+transpose");</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> newSel.push(new Range(cur, cur));</span> <span class='diff-add'> }</span> <span class='diff-add'> cm.setSelections(newSel);</span> <span class='diff-add'> });</span> <span class='diff-add'> },</span> <span class='diff-add'> newlineAndIndent: function(cm) {</span> <span class='diff-add'> runInOp(cm, function() {</span> <span class='diff-add'> var len = cm.listSelections().length;</span> <span class='diff-add'> for (var i = 0; i < len; i++) {</span> <span class='diff-add'> var range = cm.listSelections()[i];</span> <span class='diff-add'> cm.replaceRange("\n", range.anchor, range.head, "+input");</span> <span class='diff-add'> cm.indentLine(range.from().line + 1, null, true);</span> <span class='diff-add'> ensureCursorVisible(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> },</span> <span class='diff-add'> toggleOverwrite: function(cm) {cm.toggleOverwrite();}</span> <span class='diff-add'> };</span> <span class='diff-add'> // STANDARD KEYMAPS</span> <span class='diff-add'> var keyMap = CodeMirror.keyMap = {};</span> <span class='diff-add'> keyMap.basic = {</span> <span class='diff-add'> "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",</span> <span class='diff-add'> "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",</span> <span class='diff-add'> "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore",</span> <span class='diff-add'> "Tab": "defaultTab", "Shift-Tab": "indentAuto",</span> <span class='diff-add'> "Enter": "newlineAndIndent", "Insert": "toggleOverwrite",</span> <span class='diff-add'> "Esc": "singleSelection"</span> <span class='diff-add'> };</span> <span class='diff-add'> // Note that the save and find-related commands aren't defined by</span> <span class='diff-add'> // default. User code or addons can define them. Unknown commands</span> <span class='diff-add'> // are simply ignored.</span> <span class='diff-add'> keyMap.pcDefault = {</span> <span class='diff-add'> "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",</span> <span class='diff-add'> "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown",</span> <span class='diff-add'> "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",</span> <span class='diff-add'> "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",</span> <span class='diff-add'> "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",</span> <span class='diff-add'> "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",</span> <span class='diff-add'> "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection",</span> <span class='diff-add'> fallthrough: "basic"</span> <span class='diff-add'> };</span> <span class='diff-add'> // Very basic readline/emacs-style bindings, which are standard on Mac.</span> <span class='diff-add'> keyMap.emacsy = {</span> <span class='diff-add'> "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",</span> <span class='diff-add'> "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",</span> <span class='diff-add'> "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",</span> <span class='diff-add'> "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"</span> <span class='diff-add'> };</span> <span class='diff-add'> keyMap.macDefault = {</span> <span class='diff-add'> "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",</span> <span class='diff-add'> "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft",</span> <span class='diff-add'> "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore",</span> <span class='diff-add'> "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",</span> <span class='diff-add'> "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",</span> <span class='diff-add'> "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight",</span> <span class='diff-add'> "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd",</span> <span class='diff-add'> fallthrough: ["basic", "emacsy"]</span> <span class='diff-add'> };</span> <span class='diff-add'> keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;</span> <span class='diff-add'> // KEYMAP DISPATCH</span> <span class='diff-add'> function normalizeKeyName(name) {</span> <span class='diff-add'> var parts = name.split(/-(?!$)/), name = parts[parts.length - 1];</span> <span class='diff-add'> var alt, ctrl, shift, cmd;</span> <span class='diff-add'> for (var i = 0; i < parts.length - 1; i++) {</span> <span class='diff-add'> var mod = parts[i];</span> <span class='diff-add'> if (/^(cmd|meta|m)$/i.test(mod)) cmd = true;</span> <span class='diff-add'> else if (/^a(lt)?$/i.test(mod)) alt = true;</span> <span class='diff-add'> else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true;</span> <span class='diff-add'> else if (/^s(hift)$/i.test(mod)) shift = true;</span> <span class='diff-add'> else throw new Error("Unrecognized modifier name: " + mod);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (alt) name = "Alt-" + name;</span> <span class='diff-add'> if (ctrl) name = "Ctrl-" + name;</span> <span class='diff-add'> if (cmd) name = "Cmd-" + name;</span> <span class='diff-add'> if (shift) name = "Shift-" + name;</span> <span class='diff-add'> return name;</span> <span class='diff-add'> }</span> <span class='diff-add'> // This is a kludge to keep keymaps mostly working as raw objects</span> <span class='diff-add'> // (backwards compatibility) while at the same time support features</span> <span class='diff-add'> // like normalization and multi-stroke key bindings. It compiles a</span> <span class='diff-add'> // new normalized keymap, and then updates the old object to reflect</span> <span class='diff-add'> // this.</span> <span class='diff-add'> CodeMirror.normalizeKeyMap = function(keymap) {</span> <span class='diff-add'> var copy = {};</span> <span class='diff-add'> for (var keyname in keymap) if (keymap.hasOwnProperty(keyname)) {</span> <span class='diff-add'> var value = keymap[keyname];</span> <span class='diff-add'> if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) continue;</span> <span class='diff-add'> if (value == "...") { delete keymap[keyname]; continue; }</span> <span class='diff-add'> var keys = map(keyname.split(" "), normalizeKeyName);</span> <span class='diff-add'> for (var i = 0; i < keys.length; i++) {</span> <span class='diff-add'> var val, name;</span> <span class='diff-add'> if (i == keys.length - 1) {</span> <span class='diff-add'> name = keyname;</span> <span class='diff-add'> val = value;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> name = keys.slice(0, i + 1).join(" ");</span> <span class='diff-add'> val = "...";</span> <span class='diff-add'> }</span> <span class='diff-add'> var prev = copy[name];</span> <span class='diff-add'> if (!prev) copy[name] = val;</span> <span class='diff-add'> else if (prev != val) throw new Error("Inconsistent bindings for " + name);</span> <span class='diff-add'> }</span> <span class='diff-add'> delete keymap[keyname];</span> <span class='diff-add'> }</span> <span class='diff-add'> for (var prop in copy) keymap[prop] = copy[prop];</span> <span class='diff-add'> return keymap;</span> <span class='diff-add'> };</span> <span class='diff-add'> var lookupKey = CodeMirror.lookupKey = function(key, map, handle, context) {</span> <span class='diff-add'> map = getKeyMap(map);</span> <span class='diff-add'> var found = map.call ? map.call(key, context) : map[key];</span> <span class='diff-add'> if (found === false) return "nothing";</span> <span class='diff-add'> if (found === "...") return "multi";</span> <span class='diff-add'> if (found != null && handle(found)) return "handled";</span> <span class='diff-add'> if (map.fallthrough) {</span> <span class='diff-add'> if (Object.prototype.toString.call(map.fallthrough) != "[object Array]")</span> <span class='diff-add'> return lookupKey(key, map.fallthrough, handle, context);</span> <span class='diff-add'> for (var i = 0; i < map.fallthrough.length; i++) {</span> <span class='diff-add'> var result = lookupKey(key, map.fallthrough[i], handle, context);</span> <span class='diff-add'> if (result) return result;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // Modifier key presses don't count as 'real' key presses for the</span> <span class='diff-add'> // purpose of keymap fallthrough.</span> <span class='diff-add'> var isModifierKey = CodeMirror.isModifierKey = function(value) {</span> <span class='diff-add'> var name = typeof value == "string" ? value : keyNames[value.keyCode];</span> <span class='diff-add'> return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";</span> <span class='diff-add'> };</span> <span class='diff-add'> // Look up the name of a key as indicated by an event object.</span> <span class='diff-add'> var keyName = CodeMirror.keyName = function(event, noShift) {</span> <span class='diff-add'> if (presto && event.keyCode == 34 && event["char"]) return false;</span> <span class='diff-add'> var base = keyNames[event.keyCode], name = base;</span> <span class='diff-add'> if (name == null || event.altGraphKey) return false;</span> <span class='diff-add'> if (event.altKey && base != "Alt") name = "Alt-" + name;</span> <span class='diff-add'> if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") name = "Ctrl-" + name;</span> <span class='diff-add'> if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Cmd") name = "Cmd-" + name;</span> <span class='diff-add'> if (!noShift && event.shiftKey && base != "Shift") name = "Shift-" + name;</span> <span class='diff-add'> return name;</span> <span class='diff-add'> };</span> <span class='diff-add'> function getKeyMap(val) {</span> <span class='diff-add'> return typeof val == "string" ? keyMap[val] : val;</span> <span class='diff-add'> }</span> <span class='diff-add'> // FROMTEXTAREA</span> <span class='diff-add'> CodeMirror.fromTextArea = function(textarea, options) {</span> <span class='diff-add'> if (!options) options = {};</span> <span class='diff-add'> options.value = textarea.value;</span> <span class='diff-add'> if (!options.tabindex && textarea.tabindex)</span> <span class='diff-add'> options.tabindex = textarea.tabindex;</span> <span class='diff-add'> if (!options.placeholder && textarea.placeholder)</span> <span class='diff-add'> options.placeholder = textarea.placeholder;</span> <span class='diff-add'> // Set autofocus to true if this textarea is focused, or if it has</span> <span class='diff-add'> // autofocus and no other element is focused.</span> <span class='diff-add'> if (options.autofocus == null) {</span> <span class='diff-add'> var hasFocus = activeElt();</span> <span class='diff-add'> options.autofocus = hasFocus == textarea ||</span> <span class='diff-add'> textarea.getAttribute("autofocus") != null && hasFocus == document.body;</span> <span class='diff-add'> }</span> <span class='diff-add'> function save() {textarea.value = cm.getValue();}</span> <span class='diff-add'> if (textarea.form) {</span> <span class='diff-add'> on(textarea.form, "submit", save);</span> <span class='diff-add'> // Deplorable hack to make the submit method do the right thing.</span> <span class='diff-add'> if (!options.leaveSubmitMethodAlone) {</span> <span class='diff-add'> var form = textarea.form, realSubmit = form.submit;</span> <span class='diff-add'> try {</span> <span class='diff-add'> var wrappedSubmit = form.submit = function() {</span> <span class='diff-add'> save();</span> <span class='diff-add'> form.submit = realSubmit;</span> <span class='diff-add'> form.submit();</span> <span class='diff-add'> form.submit = wrappedSubmit;</span> <span class='diff-add'> };</span> <span class='diff-add'> } catch(e) {}</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> textarea.style.display = "none";</span> <span class='diff-add'> var cm = CodeMirror(function(node) {</span> <span class='diff-add'> textarea.parentNode.insertBefore(node, textarea.nextSibling);</span> <span class='diff-add'> }, options);</span> <span class='diff-add'> cm.save = save;</span> <span class='diff-add'> cm.getTextArea = function() { return textarea; };</span> <span class='diff-add'> cm.toTextArea = function() {</span> <span class='diff-add'> cm.toTextArea = isNaN; // Prevent this from being ran twice</span> <span class='diff-add'> save();</span> <span class='diff-add'> textarea.parentNode.removeChild(cm.getWrapperElement());</span> <span class='diff-add'> textarea.style.display = "";</span> <span class='diff-add'> if (textarea.form) {</span> <span class='diff-add'> off(textarea.form, "submit", save);</span> <span class='diff-add'> if (typeof textarea.form.submit == "function")</span> <span class='diff-add'> textarea.form.submit = realSubmit;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> return cm;</span> <span class='diff-add'> };</span> <span class='diff-add'> // STRING STREAM</span> <span class='diff-add'> // Fed to the mode parsers, provides helper functions to make</span> <span class='diff-add'> // parsers more succinct.</span> <span class='diff-add'> var StringStream = CodeMirror.StringStream = function(string, tabSize) {</span> <span class='diff-add'> this.pos = this.start = 0;</span> <span class='diff-add'> this.string = string;</span> <span class='diff-add'> this.tabSize = tabSize || 8;</span> <span class='diff-add'> this.lastColumnPos = this.lastColumnValue = 0;</span> <span class='diff-add'> this.lineStart = 0;</span> <span class='diff-add'> };</span> <span class='diff-add'> StringStream.prototype = {</span> <span class='diff-add'> eol: function() {return this.pos >= this.string.length;},</span> <span class='diff-add'> sol: function() {return this.pos == this.lineStart;},</span> <span class='diff-add'> peek: function() {return this.string.charAt(this.pos) || undefined;},</span> <span class='diff-add'> next: function() {</span> <span class='diff-add'> if (this.pos < this.string.length)</span> <span class='diff-add'> return this.string.charAt(this.pos++);</span> <span class='diff-add'> },</span> <span class='diff-add'> eat: function(match) {</span> <span class='diff-add'> var ch = this.string.charAt(this.pos);</span> <span class='diff-add'> if (typeof match == "string") var ok = ch == match;</span> <span class='diff-add'> else var ok = ch && (match.test ? match.test(ch) : match(ch));</span> <span class='diff-add'> if (ok) {++this.pos; return ch;}</span> <span class='diff-add'> },</span> <span class='diff-add'> eatWhile: function(match) {</span> <span class='diff-add'> var start = this.pos;</span> <span class='diff-add'> while (this.eat(match)){}</span> <span class='diff-add'> return this.pos > start;</span> <span class='diff-add'> },</span> <span class='diff-add'> eatSpace: function() {</span> <span class='diff-add'> var start = this.pos;</span> <span class='diff-add'> while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;</span> <span class='diff-add'> return this.pos > start;</span> <span class='diff-add'> },</span> <span class='diff-add'> skipToEnd: function() {this.pos = this.string.length;},</span> <span class='diff-add'> skipTo: function(ch) {</span> <span class='diff-add'> var found = this.string.indexOf(ch, this.pos);</span> <span class='diff-add'> if (found > -1) {this.pos = found; return true;}</span> <span class='diff-add'> },</span> <span class='diff-add'> backUp: function(n) {this.pos -= n;},</span> <span class='diff-add'> column: function() {</span> <span class='diff-add'> if (this.lastColumnPos < this.start) {</span> <span class='diff-add'> this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);</span> <span class='diff-add'> this.lastColumnPos = this.start;</span> <span class='diff-add'> }</span> <span class='diff-add'> return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);</span> <span class='diff-add'> },</span> <span class='diff-add'> indentation: function() {</span> <span class='diff-add'> return countColumn(this.string, null, this.tabSize) -</span> <span class='diff-add'> (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);</span> <span class='diff-add'> },</span> <span class='diff-add'> match: function(pattern, consume, caseInsensitive) {</span> <span class='diff-add'> if (typeof pattern == "string") {</span> <span class='diff-add'> var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};</span> <span class='diff-add'> var substr = this.string.substr(this.pos, pattern.length);</span> <span class='diff-add'> if (cased(substr) == cased(pattern)) {</span> <span class='diff-add'> if (consume !== false) this.pos += pattern.length;</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var match = this.string.slice(this.pos).match(pattern);</span> <span class='diff-add'> if (match && match.index > 0) return null;</span> <span class='diff-add'> if (match && consume !== false) this.pos += match[0].length;</span> <span class='diff-add'> return match;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> current: function(){return this.string.slice(this.start, this.pos);},</span> <span class='diff-add'> hideFirstChars: function(n, inner) {</span> <span class='diff-add'> this.lineStart += n;</span> <span class='diff-add'> try { return inner(); }</span> <span class='diff-add'> finally { this.lineStart -= n; }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // TEXTMARKERS</span> <span class='diff-add'> // Created with markText and setBookmark methods. A TextMarker is a</span> <span class='diff-add'> // handle that can be used to clear or find a marked position in the</span> <span class='diff-add'> // document. Line objects hold arrays (markedSpans) containing</span> <span class='diff-add'> // {from, to, marker} object pointing to such marker objects, and</span> <span class='diff-add'> // indicating that such a marker is present on that line. Multiple</span> <span class='diff-add'> // lines may point to the same marker when it spans across lines.</span> <span class='diff-add'> // The spans will have null for their from/to properties when the</span> <span class='diff-add'> // marker continues beyond the start/end of the line. Markers have</span> <span class='diff-add'> // links back to the lines they currently touch.</span> <span class='diff-add'> var TextMarker = CodeMirror.TextMarker = function(doc, type) {</span> <span class='diff-add'> this.lines = [];</span> <span class='diff-add'> this.type = type;</span> <span class='diff-add'> this.doc = doc;</span> <span class='diff-add'> };</span> <span class='diff-add'> eventMixin(TextMarker);</span> <span class='diff-add'> // Clear the marker.</span> <span class='diff-add'> TextMarker.prototype.clear = function() {</span> <span class='diff-add'> if (this.explicitlyCleared) return;</span> <span class='diff-add'> var cm = this.doc.cm, withOp = cm && !cm.curOp;</span> <span class='diff-add'> if (withOp) startOperation(cm);</span> <span class='diff-add'> if (hasHandler(this, "clear")) {</span> <span class='diff-add'> var found = this.find();</span> <span class='diff-add'> if (found) signalLater(this, "clear", found.from, found.to);</span> <span class='diff-add'> }</span> <span class='diff-add'> var min = null, max = null;</span> <span class='diff-add'> for (var i = 0; i < this.lines.length; ++i) {</span> <span class='diff-add'> var line = this.lines[i];</span> <span class='diff-add'> var span = getMarkedSpanFor(line.markedSpans, this);</span> <span class='diff-add'> if (cm && !this.collapsed) regLineChange(cm, lineNo(line), "text");</span> <span class='diff-add'> else if (cm) {</span> <span class='diff-add'> if (span.to != null) max = lineNo(line);</span> <span class='diff-add'> if (span.from != null) min = lineNo(line);</span> <span class='diff-add'> }</span> <span class='diff-add'> line.markedSpans = removeMarkedSpan(line.markedSpans, span);</span> <span class='diff-add'> if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)</span> <span class='diff-add'> updateLineHeight(line, textHeight(cm.display));</span> <span class='diff-add'> }</span> <span class='diff-add'> if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) {</span> <span class='diff-add'> var visual = visualLine(this.lines[i]), len = lineLength(visual);</span> <span class='diff-add'> if (len > cm.display.maxLineLength) {</span> <span class='diff-add'> cm.display.maxLine = visual;</span> <span class='diff-add'> cm.display.maxLineLength = len;</span> <span class='diff-add'> cm.display.maxLineChanged = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (min != null && cm && this.collapsed) regChange(cm, min, max + 1);</span> <span class='diff-add'> this.lines.length = 0;</span> <span class='diff-add'> this.explicitlyCleared = true;</span> <span class='diff-add'> if (this.atomic && this.doc.cantEdit) {</span> <span class='diff-add'> this.doc.cantEdit = false;</span> <span class='diff-add'> if (cm) reCheckSelection(cm.doc);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (cm) signalLater(cm, "markerCleared", cm, this);</span> <span class='diff-add'> if (withOp) endOperation(cm);</span> <span class='diff-add'> if (this.parent) this.parent.clear();</span> <span class='diff-add'> };</span> <span class='diff-add'> // Find the position of the marker in the document. Returns a {from,</span> <span class='diff-add'> // to} object by default. Side can be passed to get a specific side</span> <span class='diff-add'> // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the</span> <span class='diff-add'> // Pos objects returned contain a line object, rather than a line</span> <span class='diff-add'> // number (used to prevent looking up the same line twice).</span> <span class='diff-add'> TextMarker.prototype.find = function(side, lineObj) {</span> <span class='diff-add'> if (side == null && this.type == "bookmark") side = 1;</span> <span class='diff-add'> var from, to;</span> <span class='diff-add'> for (var i = 0; i < this.lines.length; ++i) {</span> <span class='diff-add'> var line = this.lines[i];</span> <span class='diff-add'> var span = getMarkedSpanFor(line.markedSpans, this);</span> <span class='diff-add'> if (span.from != null) {</span> <span class='diff-add'> from = Pos(lineObj ? line : lineNo(line), span.from);</span> <span class='diff-add'> if (side == -1) return from;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (span.to != null) {</span> <span class='diff-add'> to = Pos(lineObj ? line : lineNo(line), span.to);</span> <span class='diff-add'> if (side == 1) return to;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return from && {from: from, to: to};</span> <span class='diff-add'> };</span> <span class='diff-add'> // Signals that the marker's widget changed, and surrounding layout</span> <span class='diff-add'> // should be recomputed.</span> <span class='diff-add'> TextMarker.prototype.changed = function() {</span> <span class='diff-add'> var pos = this.find(-1, true), widget = this, cm = this.doc.cm;</span> <span class='diff-add'> if (!pos || !cm) return;</span> <span class='diff-add'> runInOp(cm, function() {</span> <span class='diff-add'> var line = pos.line, lineN = lineNo(pos.line);</span> <span class='diff-add'> var view = findViewForLine(cm, lineN);</span> <span class='diff-add'> if (view) {</span> <span class='diff-add'> clearLineMeasurementCacheFor(view);</span> <span class='diff-add'> cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> cm.curOp.updateMaxLine = true;</span> <span class='diff-add'> if (!lineIsHidden(widget.doc, line) && widget.height != null) {</span> <span class='diff-add'> var oldHeight = widget.height;</span> <span class='diff-add'> widget.height = null;</span> <span class='diff-add'> var dHeight = widgetHeight(widget) - oldHeight;</span> <span class='diff-add'> if (dHeight)</span> <span class='diff-add'> updateLineHeight(line, line.height + dHeight);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> TextMarker.prototype.attachLine = function(line) {</span> <span class='diff-add'> if (!this.lines.length && this.doc.cm) {</span> <span class='diff-add'> var op = this.doc.cm.curOp;</span> <span class='diff-add'> if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)</span> <span class='diff-add'> (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.lines.push(line);</span> <span class='diff-add'> };</span> <span class='diff-add'> TextMarker.prototype.detachLine = function(line) {</span> <span class='diff-add'> this.lines.splice(indexOf(this.lines, line), 1);</span> <span class='diff-add'> if (!this.lines.length && this.doc.cm) {</span> <span class='diff-add'> var op = this.doc.cm.curOp;</span> <span class='diff-add'> (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // Collapsed markers have unique ids, in order to be able to order</span> <span class='diff-add'> // them, which is needed for uniquely determining an outer marker</span> <span class='diff-add'> // when they overlap (they may nest, but not partially overlap).</span> <span class='diff-add'> var nextMarkerId = 0;</span> <span class='diff-add'> // Create a marker, wire it up to the right lines, and</span> <span class='diff-add'> function markText(doc, from, to, options, type) {</span> <span class='diff-add'> // Shared markers (across linked documents) are handled separately</span> <span class='diff-add'> // (markTextShared will call out to this again, once per</span> <span class='diff-add'> // document).</span> <span class='diff-add'> if (options && options.shared) return markTextShared(doc, from, to, options, type);</span> <span class='diff-add'> // Ensure we are in an operation.</span> <span class='diff-add'> if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);</span> <span class='diff-add'> var marker = new TextMarker(doc, type), diff = cmp(from, to);</span> <span class='diff-add'> if (options) copyObj(options, marker, false);</span> <span class='diff-add'> // Don't connect empty markers unless clearWhenEmpty is false</span> <span class='diff-add'> if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)</span> <span class='diff-add'> return marker;</span> <span class='diff-add'> if (marker.replacedWith) {</span> <span class='diff-add'> // Showing up as a widget implies collapsed (widget replaces text)</span> <span class='diff-add'> marker.collapsed = true;</span> <span class='diff-add'> marker.widgetNode = elt("span", [marker.replacedWith], "CodeMirror-widget");</span> <span class='diff-add'> if (!options.handleMouseEvents) marker.widgetNode.setAttribute("cm-ignore-events", "true");</span> <span class='diff-add'> if (options.insertLeft) marker.widgetNode.insertLeft = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (marker.collapsed) {</span> <span class='diff-add'> if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||</span> <span class='diff-add'> from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))</span> <span class='diff-add'> throw new Error("Inserting collapsed marker partially overlapping an existing one");</span> <span class='diff-add'> sawCollapsedSpans = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (marker.addToHistory)</span> <span class='diff-add'> addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN);</span> <span class='diff-add'> var curLine = from.line, cm = doc.cm, updateMaxLine;</span> <span class='diff-add'> doc.iter(curLine, to.line + 1, function(line) {</span> <span class='diff-add'> if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)</span> <span class='diff-add'> updateMaxLine = true;</span> <span class='diff-add'> if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0);</span> <span class='diff-add'> addMarkedSpan(line, new MarkedSpan(marker,</span> <span class='diff-add'> curLine == from.line ? from.ch : null,</span> <span class='diff-add'> curLine == to.line ? to.ch : null));</span> <span class='diff-add'> ++curLine;</span> <span class='diff-add'> });</span> <span class='diff-add'> // lineIsHidden depends on the presence of the spans, so needs a second pass</span> <span class='diff-add'> if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) {</span> <span class='diff-add'> if (lineIsHidden(doc, line)) updateLineHeight(line, 0);</span> <span class='diff-add'> });</span> <span class='diff-add'> if (marker.clearOnEnter) on(marker, "beforeCursorEnter", function() { marker.clear(); });</span> <span class='diff-add'> if (marker.readOnly) {</span> <span class='diff-add'> sawReadOnlySpans = true;</span> <span class='diff-add'> if (doc.history.done.length || doc.history.undone.length)</span> <span class='diff-add'> doc.clearHistory();</span> <span class='diff-add'> }</span> <span class='diff-add'> if (marker.collapsed) {</span> <span class='diff-add'> marker.id = ++nextMarkerId;</span> <span class='diff-add'> marker.atomic = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (cm) {</span> <span class='diff-add'> // Sync editor state</span> <span class='diff-add'> if (updateMaxLine) cm.curOp.updateMaxLine = true;</span> <span class='diff-add'> if (marker.collapsed)</span> <span class='diff-add'> regChange(cm, from.line, to.line + 1);</span> <span class='diff-add'> else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css)</span> <span class='diff-add'> for (var i = from.line; i <= to.line; i++) regLineChange(cm, i, "text");</span> <span class='diff-add'> if (marker.atomic) reCheckSelection(cm.doc);</span> <span class='diff-add'> signalLater(cm, "markerAdded", cm, marker);</span> <span class='diff-add'> }</span> <span class='diff-add'> return marker;</span> <span class='diff-add'> }</span> <span class='diff-add'> // SHARED TEXTMARKERS</span> <span class='diff-add'> // A shared marker spans multiple linked documents. It is</span> <span class='diff-add'> // implemented as a meta-marker-object controlling multiple normal</span> <span class='diff-add'> // markers.</span> <span class='diff-add'> var SharedTextMarker = CodeMirror.SharedTextMarker = function(markers, primary) {</span> <span class='diff-add'> this.markers = markers;</span> <span class='diff-add'> this.primary = primary;</span> <span class='diff-add'> for (var i = 0; i < markers.length; ++i)</span> <span class='diff-add'> markers[i].parent = this;</span> <span class='diff-add'> };</span> <span class='diff-add'> eventMixin(SharedTextMarker);</span> <span class='diff-add'> SharedTextMarker.prototype.clear = function() {</span> <span class='diff-add'> if (this.explicitlyCleared) return;</span> <span class='diff-add'> this.explicitlyCleared = true;</span> <span class='diff-add'> for (var i = 0; i < this.markers.length; ++i)</span> <span class='diff-add'> this.markers[i].clear();</span> <span class='diff-add'> signalLater(this, "clear");</span> <span class='diff-add'> };</span> <span class='diff-add'> SharedTextMarker.prototype.find = function(side, lineObj) {</span> <span class='diff-add'> return this.primary.find(side, lineObj);</span> <span class='diff-add'> };</span> <span class='diff-add'> function markTextShared(doc, from, to, options, type) {</span> <span class='diff-add'> options = copyObj(options);</span> <span class='diff-add'> options.shared = false;</span> <span class='diff-add'> var markers = [markText(doc, from, to, options, type)], primary = markers[0];</span> <span class='diff-add'> var widget = options.widgetNode;</span> <span class='diff-add'> linkedDocs(doc, function(doc) {</span> <span class='diff-add'> if (widget) options.widgetNode = widget.cloneNode(true);</span> <span class='diff-add'> markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));</span> <span class='diff-add'> for (var i = 0; i < doc.linked.length; ++i)</span> <span class='diff-add'> if (doc.linked[i].isParent) return;</span> <span class='diff-add'> primary = lst(markers);</span> <span class='diff-add'> });</span> <span class='diff-add'> return new SharedTextMarker(markers, primary);</span> <span class='diff-add'> }</span> <span class='diff-add'> function findSharedMarkers(doc) {</span> <span class='diff-add'> return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())),</span> <span class='diff-add'> function(m) { return m.parent; });</span> <span class='diff-add'> }</span> <span class='diff-add'> function copySharedMarkers(doc, markers) {</span> <span class='diff-add'> for (var i = 0; i < markers.length; i++) {</span> <span class='diff-add'> var marker = markers[i], pos = marker.find();</span> <span class='diff-add'> var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);</span> <span class='diff-add'> if (cmp(mFrom, mTo)) {</span> <span class='diff-add'> var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);</span> <span class='diff-add'> marker.markers.push(subMark);</span> <span class='diff-add'> subMark.parent = marker;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function detachSharedMarkers(markers) {</span> <span class='diff-add'> for (var i = 0; i < markers.length; i++) {</span> <span class='diff-add'> var marker = markers[i], linked = [marker.primary.doc];;</span> <span class='diff-add'> linkedDocs(marker.primary.doc, function(d) { linked.push(d); });</span> <span class='diff-add'> for (var j = 0; j < marker.markers.length; j++) {</span> <span class='diff-add'> var subMarker = marker.markers[j];</span> <span class='diff-add'> if (indexOf(linked, subMarker.doc) == -1) {</span> <span class='diff-add'> subMarker.parent = null;</span> <span class='diff-add'> marker.markers.splice(j--, 1);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // TEXTMARKER SPANS</span> <span class='diff-add'> function MarkedSpan(marker, from, to) {</span> <span class='diff-add'> this.marker = marker;</span> <span class='diff-add'> this.from = from; this.to = to;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Search an array of spans for a span matching the given marker.</span> <span class='diff-add'> function getMarkedSpanFor(spans, marker) {</span> <span class='diff-add'> if (spans) for (var i = 0; i < spans.length; ++i) {</span> <span class='diff-add'> var span = spans[i];</span> <span class='diff-add'> if (span.marker == marker) return span;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Remove a span from an array, returning undefined if no spans are</span> <span class='diff-add'> // left (we don't store arrays for lines without spans).</span> <span class='diff-add'> function removeMarkedSpan(spans, span) {</span> <span class='diff-add'> for (var r, i = 0; i < spans.length; ++i)</span> <span class='diff-add'> if (spans[i] != span) (r || (r = [])).push(spans[i]);</span> <span class='diff-add'> return r;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Add a span to a line.</span> <span class='diff-add'> function addMarkedSpan(line, span) {</span> <span class='diff-add'> line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];</span> <span class='diff-add'> span.marker.attachLine(line);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Used for the algorithm that adjusts markers for a change in the</span> <span class='diff-add'> // document. These functions cut an array of spans at a given</span> <span class='diff-add'> // character position, returning an array of remaining chunks (or</span> <span class='diff-add'> // undefined if nothing remains).</span> <span class='diff-add'> function markedSpansBefore(old, startCh, isInsert) {</span> <span class='diff-add'> if (old) for (var i = 0, nw; i < old.length; ++i) {</span> <span class='diff-add'> var span = old[i], marker = span.marker;</span> <span class='diff-add'> var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);</span> <span class='diff-add'> if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) {</span> <span class='diff-add'> var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);</span> <span class='diff-add'> (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return nw;</span> <span class='diff-add'> }</span> <span class='diff-add'> function markedSpansAfter(old, endCh, isInsert) {</span> <span class='diff-add'> if (old) for (var i = 0, nw; i < old.length; ++i) {</span> <span class='diff-add'> var span = old[i], marker = span.marker;</span> <span class='diff-add'> var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);</span> <span class='diff-add'> if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) {</span> <span class='diff-add'> var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);</span> <span class='diff-add'> (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,</span> <span class='diff-add'> span.to == null ? null : span.to - endCh));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return nw;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Given a change object, compute the new set of marker spans that</span> <span class='diff-add'> // cover the line in which the change took place. Removes spans</span> <span class='diff-add'> // entirely within the change, reconnects spans belonging to the</span> <span class='diff-add'> // same marker that appear on both sides of the change, and cuts off</span> <span class='diff-add'> // spans partially within the change. Returns an array of span</span> <span class='diff-add'> // arrays with one element for each line in (after) the change.</span> <span class='diff-add'> function stretchSpansOverChange(doc, change) {</span> <span class='diff-add'> var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;</span> <span class='diff-add'> var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;</span> <span class='diff-add'> if (!oldFirst && !oldLast) return null;</span> <span class='diff-add'> var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;</span> <span class='diff-add'> // Get the spans that 'stick out' on both sides</span> <span class='diff-add'> var first = markedSpansBefore(oldFirst, startCh, isInsert);</span> <span class='diff-add'> var last = markedSpansAfter(oldLast, endCh, isInsert);</span> <span class='diff-add'> // Next, merge those two ends</span> <span class='diff-add'> var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);</span> <span class='diff-add'> if (first) {</span> <span class='diff-add'> // Fix up .to properties of first</span> <span class='diff-add'> for (var i = 0; i < first.length; ++i) {</span> <span class='diff-add'> var span = first[i];</span> <span class='diff-add'> if (span.to == null) {</span> <span class='diff-add'> var found = getMarkedSpanFor(last, span.marker);</span> <span class='diff-add'> if (!found) span.to = startCh;</span> <span class='diff-add'> else if (sameLine) span.to = found.to == null ? null : found.to + offset;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (last) {</span> <span class='diff-add'> // Fix up .from in last (or move them into first in case of sameLine)</span> <span class='diff-add'> for (var i = 0; i < last.length; ++i) {</span> <span class='diff-add'> var span = last[i];</span> <span class='diff-add'> if (span.to != null) span.to += offset;</span> <span class='diff-add'> if (span.from == null) {</span> <span class='diff-add'> var found = getMarkedSpanFor(first, span.marker);</span> <span class='diff-add'> if (!found) {</span> <span class='diff-add'> span.from = offset;</span> <span class='diff-add'> if (sameLine) (first || (first = [])).push(span);</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> span.from += offset;</span> <span class='diff-add'> if (sameLine) (first || (first = [])).push(span);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Make sure we didn't create any zero-length spans</span> <span class='diff-add'> if (first) first = clearEmptySpans(first);</span> <span class='diff-add'> if (last && last != first) last = clearEmptySpans(last);</span> <span class='diff-add'> var newMarkers = [first];</span> <span class='diff-add'> if (!sameLine) {</span> <span class='diff-add'> // Fill gap with whole-line-spans</span> <span class='diff-add'> var gap = change.text.length - 2, gapMarkers;</span> <span class='diff-add'> if (gap > 0 && first)</span> <span class='diff-add'> for (var i = 0; i < first.length; ++i)</span> <span class='diff-add'> if (first[i].to == null)</span> <span class='diff-add'> (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null));</span> <span class='diff-add'> for (var i = 0; i < gap; ++i)</span> <span class='diff-add'> newMarkers.push(gapMarkers);</span> <span class='diff-add'> newMarkers.push(last);</span> <span class='diff-add'> }</span> <span class='diff-add'> return newMarkers;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Remove spans that are empty and don't have a clearWhenEmpty</span> <span class='diff-add'> // option of false.</span> <span class='diff-add'> function clearEmptySpans(spans) {</span> <span class='diff-add'> for (var i = 0; i < spans.length; ++i) {</span> <span class='diff-add'> var span = spans[i];</span> <span class='diff-add'> if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)</span> <span class='diff-add'> spans.splice(i--, 1);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!spans.length) return null;</span> <span class='diff-add'> return spans;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Used for un/re-doing changes from the history. Combines the</span> <span class='diff-add'> // result of computing the existing spans with the set of spans that</span> <span class='diff-add'> // existed in the history (so that deleting around a span and then</span> <span class='diff-add'> // undoing brings back the span).</span> <span class='diff-add'> function mergeOldSpans(doc, change) {</span> <span class='diff-add'> var old = getOldSpans(doc, change);</span> <span class='diff-add'> var stretched = stretchSpansOverChange(doc, change);</span> <span class='diff-add'> if (!old) return stretched;</span> <span class='diff-add'> if (!stretched) return old;</span> <span class='diff-add'> for (var i = 0; i < old.length; ++i) {</span> <span class='diff-add'> var oldCur = old[i], stretchCur = stretched[i];</span> <span class='diff-add'> if (oldCur && stretchCur) {</span> <span class='diff-add'> spans: for (var j = 0; j < stretchCur.length; ++j) {</span> <span class='diff-add'> var span = stretchCur[j];</span> <span class='diff-add'> for (var k = 0; k < oldCur.length; ++k)</span> <span class='diff-add'> if (oldCur[k].marker == span.marker) continue spans;</span> <span class='diff-add'> oldCur.push(span);</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (stretchCur) {</span> <span class='diff-add'> old[i] = stretchCur;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return old;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Used to 'clip' out readOnly ranges when making a change.</span> <span class='diff-add'> function removeReadOnlyRanges(doc, from, to) {</span> <span class='diff-add'> var markers = null;</span> <span class='diff-add'> doc.iter(from.line, to.line + 1, function(line) {</span> <span class='diff-add'> if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {</span> <span class='diff-add'> var mark = line.markedSpans[i].marker;</span> <span class='diff-add'> if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))</span> <span class='diff-add'> (markers || (markers = [])).push(mark);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> if (!markers) return null;</span> <span class='diff-add'> var parts = [{from: from, to: to}];</span> <span class='diff-add'> for (var i = 0; i < markers.length; ++i) {</span> <span class='diff-add'> var mk = markers[i], m = mk.find(0);</span> <span class='diff-add'> for (var j = 0; j < parts.length; ++j) {</span> <span class='diff-add'> var p = parts[j];</span> <span class='diff-add'> if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) continue;</span> <span class='diff-add'> var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);</span> <span class='diff-add'> if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)</span> <span class='diff-add'> newParts.push({from: p.from, to: m.from});</span> <span class='diff-add'> if (dto > 0 || !mk.inclusiveRight && !dto)</span> <span class='diff-add'> newParts.push({from: m.to, to: p.to});</span> <span class='diff-add'> parts.splice.apply(parts, newParts);</span> <span class='diff-add'> j += newParts.length - 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return parts;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Connect or disconnect spans from a line.</span> <span class='diff-add'> function detachMarkedSpans(line) {</span> <span class='diff-add'> var spans = line.markedSpans;</span> <span class='diff-add'> if (!spans) return;</span> <span class='diff-add'> for (var i = 0; i < spans.length; ++i)</span> <span class='diff-add'> spans[i].marker.detachLine(line);</span> <span class='diff-add'> line.markedSpans = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> function attachMarkedSpans(line, spans) {</span> <span class='diff-add'> if (!spans) return;</span> <span class='diff-add'> for (var i = 0; i < spans.length; ++i)</span> <span class='diff-add'> spans[i].marker.attachLine(line);</span> <span class='diff-add'> line.markedSpans = spans;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Helpers used when computing which overlapping collapsed span</span> <span class='diff-add'> // counts as the larger one.</span> <span class='diff-add'> function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; }</span> <span class='diff-add'> function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; }</span> <span class='diff-add'> // Returns a number indicating which of two overlapping collapsed</span> <span class='diff-add'> // spans is larger (and thus includes the other). Falls back to</span> <span class='diff-add'> // comparing ids when the spans cover exactly the same range.</span> <span class='diff-add'> function compareCollapsedMarkers(a, b) {</span> <span class='diff-add'> var lenDiff = a.lines.length - b.lines.length;</span> <span class='diff-add'> if (lenDiff != 0) return lenDiff;</span> <span class='diff-add'> var aPos = a.find(), bPos = b.find();</span> <span class='diff-add'> var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);</span> <span class='diff-add'> if (fromCmp) return -fromCmp;</span> <span class='diff-add'> var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);</span> <span class='diff-add'> if (toCmp) return toCmp;</span> <span class='diff-add'> return b.id - a.id;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Find out whether a line ends or starts in a collapsed span. If</span> <span class='diff-add'> // so, return the marker for that span.</span> <span class='diff-add'> function collapsedSpanAtSide(line, start) {</span> <span class='diff-add'> var sps = sawCollapsedSpans && line.markedSpans, found;</span> <span class='diff-add'> if (sps) for (var sp, i = 0; i < sps.length; ++i) {</span> <span class='diff-add'> sp = sps[i];</span> <span class='diff-add'> if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&</span> <span class='diff-add'> (!found || compareCollapsedMarkers(found, sp.marker) < 0))</span> <span class='diff-add'> found = sp.marker;</span> <span class='diff-add'> }</span> <span class='diff-add'> return found;</span> <span class='diff-add'> }</span> <span class='diff-add'> function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); }</span> <span class='diff-add'> function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false); }</span> <span class='diff-add'> // Test whether there exists a collapsed span that partially</span> <span class='diff-add'> // overlaps (covers the start or end, but not both) of a new span.</span> <span class='diff-add'> // Such overlap is not allowed.</span> <span class='diff-add'> function conflictingCollapsedRange(doc, lineNo, from, to, marker) {</span> <span class='diff-add'> var line = getLine(doc, lineNo);</span> <span class='diff-add'> var sps = sawCollapsedSpans && line.markedSpans;</span> <span class='diff-add'> if (sps) for (var i = 0; i < sps.length; ++i) {</span> <span class='diff-add'> var sp = sps[i];</span> <span class='diff-add'> if (!sp.marker.collapsed) continue;</span> <span class='diff-add'> var found = sp.marker.find(0);</span> <span class='diff-add'> var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);</span> <span class='diff-add'> var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);</span> <span class='diff-add'> if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue;</span> <span class='diff-add'> if (fromCmp <= 0 && (cmp(found.to, from) > 0 || (sp.marker.inclusiveRight && marker.inclusiveLeft)) ||</span> <span class='diff-add'> fromCmp >= 0 && (cmp(found.from, to) < 0 || (sp.marker.inclusiveLeft && marker.inclusiveRight)))</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // A visual line is a line as drawn on the screen. Folding, for</span> <span class='diff-add'> // example, can cause multiple logical lines to appear on the same</span> <span class='diff-add'> // visual line. This finds the start of the visual line that the</span> <span class='diff-add'> // given line is part of (usually that is the line itself).</span> <span class='diff-add'> function visualLine(line) {</span> <span class='diff-add'> var merged;</span> <span class='diff-add'> while (merged = collapsedSpanAtStart(line))</span> <span class='diff-add'> line = merged.find(-1, true).line;</span> <span class='diff-add'> return line;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Returns an array of logical lines that continue the visual line</span> <span class='diff-add'> // started by the argument, or undefined if there are no such lines.</span> <span class='diff-add'> function visualLineContinued(line) {</span> <span class='diff-add'> var merged, lines;</span> <span class='diff-add'> while (merged = collapsedSpanAtEnd(line)) {</span> <span class='diff-add'> line = merged.find(1, true).line;</span> <span class='diff-add'> (lines || (lines = [])).push(line);</span> <span class='diff-add'> }</span> <span class='diff-add'> return lines;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Get the line number of the start of the visual line that the</span> <span class='diff-add'> // given line number is part of.</span> <span class='diff-add'> function visualLineNo(doc, lineN) {</span> <span class='diff-add'> var line = getLine(doc, lineN), vis = visualLine(line);</span> <span class='diff-add'> if (line == vis) return lineN;</span> <span class='diff-add'> return lineNo(vis);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Get the line number of the start of the next visual line after</span> <span class='diff-add'> // the given line.</span> <span class='diff-add'> function visualLineEndNo(doc, lineN) {</span> <span class='diff-add'> if (lineN > doc.lastLine()) return lineN;</span> <span class='diff-add'> var line = getLine(doc, lineN), merged;</span> <span class='diff-add'> if (!lineIsHidden(doc, line)) return lineN;</span> <span class='diff-add'> while (merged = collapsedSpanAtEnd(line))</span> <span class='diff-add'> line = merged.find(1, true).line;</span> <span class='diff-add'> return lineNo(line) + 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Compute whether a line is hidden. Lines count as hidden when they</span> <span class='diff-add'> // are part of a visual line that starts with another line, or when</span> <span class='diff-add'> // they are entirely covered by collapsed, non-widget span.</span> <span class='diff-add'> function lineIsHidden(doc, line) {</span> <span class='diff-add'> var sps = sawCollapsedSpans && line.markedSpans;</span> <span class='diff-add'> if (sps) for (var sp, i = 0; i < sps.length; ++i) {</span> <span class='diff-add'> sp = sps[i];</span> <span class='diff-add'> if (!sp.marker.collapsed) continue;</span> <span class='diff-add'> if (sp.from == null) return true;</span> <span class='diff-add'> if (sp.marker.widgetNode) continue;</span> <span class='diff-add'> if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function lineIsHiddenInner(doc, line, span) {</span> <span class='diff-add'> if (span.to == null) {</span> <span class='diff-add'> var end = span.marker.find(1, true);</span> <span class='diff-add'> return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker));</span> <span class='diff-add'> }</span> <span class='diff-add'> if (span.marker.inclusiveRight && span.to == line.text.length)</span> <span class='diff-add'> return true;</span> <span class='diff-add'> for (var sp, i = 0; i < line.markedSpans.length; ++i) {</span> <span class='diff-add'> sp = line.markedSpans[i];</span> <span class='diff-add'> if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&</span> <span class='diff-add'> (sp.to == null || sp.to != span.from) &&</span> <span class='diff-add'> (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&</span> <span class='diff-add'> lineIsHiddenInner(doc, line, sp)) return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // LINE WIDGETS</span> <span class='diff-add'> // Line widgets are block elements displayed above or below a line.</span> <span class='diff-add'> var LineWidget = CodeMirror.LineWidget = function(cm, node, options) {</span> <span class='diff-add'> if (options) for (var opt in options) if (options.hasOwnProperty(opt))</span> <span class='diff-add'> this[opt] = options[opt];</span> <span class='diff-add'> this.cm = cm;</span> <span class='diff-add'> this.node = node;</span> <span class='diff-add'> };</span> <span class='diff-add'> eventMixin(LineWidget);</span> <span class='diff-add'> function adjustScrollWhenAboveVisible(cm, line, diff) {</span> <span class='diff-add'> if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))</span> <span class='diff-add'> addToScrollPos(cm, null, diff);</span> <span class='diff-add'> }</span> <span class='diff-add'> LineWidget.prototype.clear = function() {</span> <span class='diff-add'> var cm = this.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);</span> <span class='diff-add'> if (no == null || !ws) return;</span> <span class='diff-add'> for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);</span> <span class='diff-add'> if (!ws.length) line.widgets = null;</span> <span class='diff-add'> var height = widgetHeight(this);</span> <span class='diff-add'> runInOp(cm, function() {</span> <span class='diff-add'> adjustScrollWhenAboveVisible(cm, line, -height);</span> <span class='diff-add'> regLineChange(cm, no, "widget");</span> <span class='diff-add'> updateLineHeight(line, Math.max(0, line.height - height));</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> LineWidget.prototype.changed = function() {</span> <span class='diff-add'> var oldH = this.height, cm = this.cm, line = this.line;</span> <span class='diff-add'> this.height = null;</span> <span class='diff-add'> var diff = widgetHeight(this) - oldH;</span> <span class='diff-add'> if (!diff) return;</span> <span class='diff-add'> runInOp(cm, function() {</span> <span class='diff-add'> cm.curOp.forceUpdate = true;</span> <span class='diff-add'> adjustScrollWhenAboveVisible(cm, line, diff);</span> <span class='diff-add'> updateLineHeight(line, line.height + diff);</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> function widgetHeight(widget) {</span> <span class='diff-add'> if (widget.height != null) return widget.height;</span> <span class='diff-add'> if (!contains(document.body, widget.node)) {</span> <span class='diff-add'> var parentStyle = "position: relative;";</span> <span class='diff-add'> if (widget.coverGutter)</span> <span class='diff-add'> parentStyle += "margin-left: -" + widget.cm.getGutterElement().offsetWidth + "px;";</span> <span class='diff-add'> removeChildrenAndAdd(widget.cm.display.measure, elt("div", [widget.node], null, parentStyle));</span> <span class='diff-add'> }</span> <span class='diff-add'> return widget.height = widget.node.offsetHeight;</span> <span class='diff-add'> }</span> <span class='diff-add'> function addLineWidget(cm, handle, node, options) {</span> <span class='diff-add'> var widget = new LineWidget(cm, node, options);</span> <span class='diff-add'> if (widget.noHScroll) cm.display.alignWidgets = true;</span> <span class='diff-add'> changeLine(cm.doc, handle, "widget", function(line) {</span> <span class='diff-add'> var widgets = line.widgets || (line.widgets = []);</span> <span class='diff-add'> if (widget.insertAt == null) widgets.push(widget);</span> <span class='diff-add'> else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);</span> <span class='diff-add'> widget.line = line;</span> <span class='diff-add'> if (!lineIsHidden(cm.doc, line)) {</span> <span class='diff-add'> var aboveVisible = heightAtLine(line) < cm.doc.scrollTop;</span> <span class='diff-add'> updateLineHeight(line, line.height + widgetHeight(widget));</span> <span class='diff-add'> if (aboveVisible) addToScrollPos(cm, null, widget.height);</span> <span class='diff-add'> cm.curOp.forceUpdate = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> return true;</span> <span class='diff-add'> });</span> <span class='diff-add'> return widget;</span> <span class='diff-add'> }</span> <span class='diff-add'> // LINE DATA STRUCTURE</span> <span class='diff-add'> // Line objects. These hold state related to a line, including</span> <span class='diff-add'> // highlighting info (the styles array).</span> <span class='diff-add'> var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {</span> <span class='diff-add'> this.text = text;</span> <span class='diff-add'> attachMarkedSpans(this, markedSpans);</span> <span class='diff-add'> this.height = estimateHeight ? estimateHeight(this) : 1;</span> <span class='diff-add'> };</span> <span class='diff-add'> eventMixin(Line);</span> <span class='diff-add'> Line.prototype.lineNo = function() { return lineNo(this); };</span> <span class='diff-add'> // Change the content (text, markers) of a line. Automatically</span> <span class='diff-add'> // invalidates cached information and tries to re-estimate the</span> <span class='diff-add'> // line's height.</span> <span class='diff-add'> function updateLine(line, text, markedSpans, estimateHeight) {</span> <span class='diff-add'> line.text = text;</span> <span class='diff-add'> if (line.stateAfter) line.stateAfter = null;</span> <span class='diff-add'> if (line.styles) line.styles = null;</span> <span class='diff-add'> if (line.order != null) line.order = null;</span> <span class='diff-add'> detachMarkedSpans(line);</span> <span class='diff-add'> attachMarkedSpans(line, markedSpans);</span> <span class='diff-add'> var estHeight = estimateHeight ? estimateHeight(line) : 1;</span> <span class='diff-add'> if (estHeight != line.height) updateLineHeight(line, estHeight);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Detach a line from the document tree and its markers.</span> <span class='diff-add'> function cleanUpLine(line) {</span> <span class='diff-add'> line.parent = null;</span> <span class='diff-add'> detachMarkedSpans(line);</span> <span class='diff-add'> }</span> <span class='diff-add'> function extractLineClasses(type, output) {</span> <span class='diff-add'> if (type) for (;;) {</span> <span class='diff-add'> var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/);</span> <span class='diff-add'> if (!lineClass) break;</span> <span class='diff-add'> type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);</span> <span class='diff-add'> var prop = lineClass[1] ? "bgClass" : "textClass";</span> <span class='diff-add'> if (output[prop] == null)</span> <span class='diff-add'> output[prop] = lineClass[2];</span> <span class='diff-add'> else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop]))</span> <span class='diff-add'> output[prop] += " " + lineClass[2];</span> <span class='diff-add'> }</span> <span class='diff-add'> return type;</span> <span class='diff-add'> }</span> <span class='diff-add'> function callBlankLine(mode, state) {</span> <span class='diff-add'> if (mode.blankLine) return mode.blankLine(state);</span> <span class='diff-add'> if (!mode.innerMode) return;</span> <span class='diff-add'> var inner = CodeMirror.innerMode(mode, state);</span> <span class='diff-add'> if (inner.mode.blankLine) return inner.mode.blankLine(inner.state);</span> <span class='diff-add'> }</span> <span class='diff-add'> function readToken(mode, stream, state, inner) {</span> <span class='diff-add'> for (var i = 0; i < 10; i++) {</span> <span class='diff-add'> if (inner) inner[0] = CodeMirror.innerMode(mode, state).mode;</span> <span class='diff-add'> var style = mode.token(stream, state);</span> <span class='diff-add'> if (stream.pos > stream.start) return style;</span> <span class='diff-add'> }</span> <span class='diff-add'> throw new Error("Mode " + mode.name + " failed to advance stream.");</span> <span class='diff-add'> }</span> <span class='diff-add'> // Utility for getTokenAt and getLineTokens</span> <span class='diff-add'> function takeToken(cm, pos, precise, asArray) {</span> <span class='diff-add'> function getObj(copy) {</span> <span class='diff-add'> return {start: stream.start, end: stream.pos,</span> <span class='diff-add'> string: stream.current(),</span> <span class='diff-add'> type: style || null,</span> <span class='diff-add'> state: copy ? copyState(doc.mode, state) : state};</span> <span class='diff-add'> }</span> <span class='diff-add'> var doc = cm.doc, mode = doc.mode, style;</span> <span class='diff-add'> pos = clipPos(doc, pos);</span> <span class='diff-add'> var line = getLine(doc, pos.line), state = getStateBefore(cm, pos.line, precise);</span> <span class='diff-add'> var stream = new StringStream(line.text, cm.options.tabSize), tokens;</span> <span class='diff-add'> if (asArray) tokens = [];</span> <span class='diff-add'> while ((asArray || stream.pos < pos.ch) && !stream.eol()) {</span> <span class='diff-add'> stream.start = stream.pos;</span> <span class='diff-add'> style = readToken(mode, stream, state);</span> <span class='diff-add'> if (asArray) tokens.push(getObj(true));</span> <span class='diff-add'> }</span> <span class='diff-add'> return asArray ? tokens : getObj();</span> <span class='diff-add'> }</span> <span class='diff-add'> // Run the given mode's parser over a line, calling f for each token.</span> <span class='diff-add'> function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) {</span> <span class='diff-add'> var flattenSpans = mode.flattenSpans;</span> <span class='diff-add'> if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;</span> <span class='diff-add'> var curStart = 0, curStyle = null;</span> <span class='diff-add'> var stream = new StringStream(text, cm.options.tabSize), style;</span> <span class='diff-add'> var inner = cm.options.addModeClass && [null];</span> <span class='diff-add'> if (text == "") extractLineClasses(callBlankLine(mode, state), lineClasses);</span> <span class='diff-add'> while (!stream.eol()) {</span> <span class='diff-add'> if (stream.pos > cm.options.maxHighlightLength) {</span> <span class='diff-add'> flattenSpans = false;</span> <span class='diff-add'> if (forceToEnd) processLine(cm, text, state, stream.pos);</span> <span class='diff-add'> stream.pos = text.length;</span> <span class='diff-add'> style = null;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> style = extractLineClasses(readToken(mode, stream, state, inner), lineClasses);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inner) {</span> <span class='diff-add'> var mName = inner[0].name;</span> <span class='diff-add'> if (mName) style = "m-" + (style ? mName + " " + style : mName);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!flattenSpans || curStyle != style) {</span> <span class='diff-add'> while (curStart < stream.start) {</span> <span class='diff-add'> curStart = Math.min(stream.start, curStart + 50000);</span> <span class='diff-add'> f(curStart, curStyle);</span> <span class='diff-add'> }</span> <span class='diff-add'> curStyle = style;</span> <span class='diff-add'> }</span> <span class='diff-add'> stream.start = stream.pos;</span> <span class='diff-add'> }</span> <span class='diff-add'> while (curStart < stream.pos) {</span> <span class='diff-add'> // Webkit seems to refuse to render text nodes longer than 57444 characters</span> <span class='diff-add'> var pos = Math.min(stream.pos, curStart + 50000);</span> <span class='diff-add'> f(pos, curStyle);</span> <span class='diff-add'> curStart = pos;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Compute a style array (an array starting with a mode generation</span> <span class='diff-add'> // -- for invalidation -- followed by pairs of end positions and</span> <span class='diff-add'> // style strings), which is used to highlight the tokens on the</span> <span class='diff-add'> // line.</span> <span class='diff-add'> function highlightLine(cm, line, state, forceToEnd) {</span> <span class='diff-add'> // A styles array always starts with a number identifying the</span> <span class='diff-add'> // mode/overlays that it is based on (for easy invalidation).</span> <span class='diff-add'> var st = [cm.state.modeGen], lineClasses = {};</span> <span class='diff-add'> // Compute the base array of styles</span> <span class='diff-add'> runMode(cm, line.text, cm.doc.mode, state, function(end, style) {</span> <span class='diff-add'> st.push(end, style);</span> <span class='diff-add'> }, lineClasses, forceToEnd);</span> <span class='diff-add'> // Run overlays, adjust style array.</span> <span class='diff-add'> for (var o = 0; o < cm.state.overlays.length; ++o) {</span> <span class='diff-add'> var overlay = cm.state.overlays[o], i = 1, at = 0;</span> <span class='diff-add'> runMode(cm, line.text, overlay.mode, true, function(end, style) {</span> <span class='diff-add'> var start = i;</span> <span class='diff-add'> // Ensure there's a token end at the current position, and that i points at it</span> <span class='diff-add'> while (at < end) {</span> <span class='diff-add'> var i_end = st[i];</span> <span class='diff-add'> if (i_end > end)</span> <span class='diff-add'> st.splice(i, 1, end, st[i+1], i_end);</span> <span class='diff-add'> i += 2;</span> <span class='diff-add'> at = Math.min(end, i_end);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!style) return;</span> <span class='diff-add'> if (overlay.opaque) {</span> <span class='diff-add'> st.splice(start, i - start, end, "cm-overlay " + style);</span> <span class='diff-add'> i = start + 2;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> for (; start < i; start += 2) {</span> <span class='diff-add'> var cur = st[start+1];</span> <span class='diff-add'> st[start+1] = (cur ? cur + " " : "") + "cm-overlay " + style;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }, lineClasses);</span> <span class='diff-add'> }</span> <span class='diff-add'> return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null};</span> <span class='diff-add'> }</span> <span class='diff-add'> function getLineStyles(cm, line, updateFrontier) {</span> <span class='diff-add'> if (!line.styles || line.styles[0] != cm.state.modeGen) {</span> <span class='diff-add'> var result = highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line)));</span> <span class='diff-add'> line.styles = result.styles;</span> <span class='diff-add'> if (result.classes) line.styleClasses = result.classes;</span> <span class='diff-add'> else if (line.styleClasses) line.styleClasses = null;</span> <span class='diff-add'> if (updateFrontier === cm.doc.frontier) cm.doc.frontier++;</span> <span class='diff-add'> }</span> <span class='diff-add'> return line.styles;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Lightweight form of highlight -- proceed over this line and</span> <span class='diff-add'> // update state, but don't save a style array. Used for lines that</span> <span class='diff-add'> // aren't currently visible.</span> <span class='diff-add'> function processLine(cm, text, state, startAt) {</span> <span class='diff-add'> var mode = cm.doc.mode;</span> <span class='diff-add'> var stream = new StringStream(text, cm.options.tabSize);</span> <span class='diff-add'> stream.start = stream.pos = startAt || 0;</span> <span class='diff-add'> if (text == "") callBlankLine(mode, state);</span> <span class='diff-add'> while (!stream.eol() && stream.pos <= cm.options.maxHighlightLength) {</span> <span class='diff-add'> readToken(mode, stream, state);</span> <span class='diff-add'> stream.start = stream.pos;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Convert a style as returned by a mode (either null, or a string</span> <span class='diff-add'> // containing one or more styles) to a CSS style. This is cached,</span> <span class='diff-add'> // and also looks for line-wide styles.</span> <span class='diff-add'> var styleToClassCache = {}, styleToClassCacheWithMode = {};</span> <span class='diff-add'> function interpretTokenStyle(style, options) {</span> <span class='diff-add'> if (!style || /^\s*$/.test(style)) return null;</span> <span class='diff-add'> var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;</span> <span class='diff-add'> return cache[style] ||</span> <span class='diff-add'> (cache[style] = style.replace(/\S+/g, "cm-$&"));</span> <span class='diff-add'> }</span> <span class='diff-add'> // Render the DOM representation of the text of a line. Also builds</span> <span class='diff-add'> // up a 'line map', which points at the DOM nodes that represent</span> <span class='diff-add'> // specific stretches of text, and is used by the measuring code.</span> <span class='diff-add'> // The returned object contains the DOM node, this map, and</span> <span class='diff-add'> // information about line-wide styles that were set by the mode.</span> <span class='diff-add'> function buildLineContent(cm, lineView) {</span> <span class='diff-add'> // The padding-right forces the element to have a 'border', which</span> <span class='diff-add'> // is needed on Webkit to be able to get line-level bounding</span> <span class='diff-add'> // rectangles for it (in measureChar).</span> <span class='diff-add'> var content = elt("span", null, null, webkit ? "padding-right: .1px" : null);</span> <span class='diff-add'> var builder = {pre: elt("pre", [content]), content: content, col: 0, pos: 0, cm: cm};</span> <span class='diff-add'> lineView.measure = {};</span> <span class='diff-add'> // Iterate over the logical lines that make up this visual line.</span> <span class='diff-add'> for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {</span> <span class='diff-add'> var line = i ? lineView.rest[i - 1] : lineView.line, order;</span> <span class='diff-add'> builder.pos = 0;</span> <span class='diff-add'> builder.addToken = buildToken;</span> <span class='diff-add'> // Optionally wire in some hacks into the token-rendering</span> <span class='diff-add'> // algorithm, to deal with browser quirks.</span> <span class='diff-add'> if ((ie || webkit) && cm.getOption("lineWrapping"))</span> <span class='diff-add'> builder.addToken = buildTokenSplitSpaces(builder.addToken);</span> <span class='diff-add'> if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line)))</span> <span class='diff-add'> builder.addToken = buildTokenBadBidi(builder.addToken, order);</span> <span class='diff-add'> builder.map = [];</span> <span class='diff-add'> var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);</span> <span class='diff-add'> insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));</span> <span class='diff-add'> if (line.styleClasses) {</span> <span class='diff-add'> if (line.styleClasses.bgClass)</span> <span class='diff-add'> builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || "");</span> <span class='diff-add'> if (line.styleClasses.textClass)</span> <span class='diff-add'> builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || "");</span> <span class='diff-add'> }</span> <span class='diff-add'> // Ensure at least a single node is present, for measuring.</span> <span class='diff-add'> if (builder.map.length == 0)</span> <span class='diff-add'> builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure)));</span> <span class='diff-add'> // Store the map and a cache object for the current logical line</span> <span class='diff-add'> if (i == 0) {</span> <span class='diff-add'> lineView.measure.map = builder.map;</span> <span class='diff-add'> lineView.measure.cache = {};</span> <span class='diff-add'> } else {</span> <span class='diff-add'> (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map);</span> <span class='diff-add'> (lineView.measure.caches || (lineView.measure.caches = [])).push({});</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // See issue #2901</span> <span class='diff-add'> if (webkit && /\bcm-tab\b/.test(builder.content.lastChild.className))</span> <span class='diff-add'> builder.content.className = "cm-tab-wrap-hack";</span> <span class='diff-add'> signal(cm, "renderLine", cm, lineView.line, builder.pre);</span> <span class='diff-add'> if (builder.pre.className)</span> <span class='diff-add'> builder.textClass = joinClasses(builder.pre.className, builder.textClass || "");</span> <span class='diff-add'> return builder;</span> <span class='diff-add'> }</span> <span class='diff-add'> function defaultSpecialCharPlaceholder(ch) {</span> <span class='diff-add'> var token = elt("span", "\u2022", "cm-invalidchar");</span> <span class='diff-add'> token.title = "\\u" + ch.charCodeAt(0).toString(16);</span> <span class='diff-add'> return token;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Build up the DOM representation for a single token, and add it to</span> <span class='diff-add'> // the line map. Takes care to render special characters separately.</span> <span class='diff-add'> function buildToken(builder, text, style, startStyle, endStyle, title, css) {</span> <span class='diff-add'> if (!text) return;</span> <span class='diff-add'> var special = builder.cm.options.specialChars, mustWrap = false;</span> <span class='diff-add'> if (!special.test(text)) {</span> <span class='diff-add'> builder.col += text.length;</span> <span class='diff-add'> var content = document.createTextNode(text);</span> <span class='diff-add'> builder.map.push(builder.pos, builder.pos + text.length, content);</span> <span class='diff-add'> if (ie && ie_version < 9) mustWrap = true;</span> <span class='diff-add'> builder.pos += text.length;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var content = document.createDocumentFragment(), pos = 0;</span> <span class='diff-add'> while (true) {</span> <span class='diff-add'> special.lastIndex = pos;</span> <span class='diff-add'> var m = special.exec(text);</span> <span class='diff-add'> var skipped = m ? m.index - pos : text.length - pos;</span> <span class='diff-add'> if (skipped) {</span> <span class='diff-add'> var txt = document.createTextNode(text.slice(pos, pos + skipped));</span> <span class='diff-add'> if (ie && ie_version < 9) content.appendChild(elt("span", [txt]));</span> <span class='diff-add'> else content.appendChild(txt);</span> <span class='diff-add'> builder.map.push(builder.pos, builder.pos + skipped, txt);</span> <span class='diff-add'> builder.col += skipped;</span> <span class='diff-add'> builder.pos += skipped;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!m) break;</span> <span class='diff-add'> pos += skipped + 1;</span> <span class='diff-add'> if (m[0] == "\t") {</span> <span class='diff-add'> var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;</span> <span class='diff-add'> var txt = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));</span> <span class='diff-add'> builder.col += tabWidth;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var txt = builder.cm.options.specialCharPlaceholder(m[0]);</span> <span class='diff-add'> if (ie && ie_version < 9) content.appendChild(elt("span", [txt]));</span> <span class='diff-add'> else content.appendChild(txt);</span> <span class='diff-add'> builder.col += 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> builder.map.push(builder.pos, builder.pos + 1, txt);</span> <span class='diff-add'> builder.pos++;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (style || startStyle || endStyle || mustWrap || css) {</span> <span class='diff-add'> var fullStyle = style || "";</span> <span class='diff-add'> if (startStyle) fullStyle += startStyle;</span> <span class='diff-add'> if (endStyle) fullStyle += endStyle;</span> <span class='diff-add'> var token = elt("span", [content], fullStyle, css);</span> <span class='diff-add'> if (title) token.title = title;</span> <span class='diff-add'> return builder.content.appendChild(token);</span> <span class='diff-add'> }</span> <span class='diff-add'> builder.content.appendChild(content);</span> <span class='diff-add'> }</span> <span class='diff-add'> function buildTokenSplitSpaces(inner) {</span> <span class='diff-add'> function split(old) {</span> <span class='diff-add'> var out = " ";</span> <span class='diff-add'> for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? " " : "\u00a0";</span> <span class='diff-add'> out += " ";</span> <span class='diff-add'> return out;</span> <span class='diff-add'> }</span> <span class='diff-add'> return function(builder, text, style, startStyle, endStyle, title) {</span> <span class='diff-add'> inner(builder, text.replace(/ {3,}/g, split), style, startStyle, endStyle, title);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> // Work around nonsense dimensions being reported for stretches of</span> <span class='diff-add'> // right-to-left text.</span> <span class='diff-add'> function buildTokenBadBidi(inner, order) {</span> <span class='diff-add'> return function(builder, text, style, startStyle, endStyle, title) {</span> <span class='diff-add'> style = style ? style + " cm-force-border" : "cm-force-border";</span> <span class='diff-add'> var start = builder.pos, end = start + text.length;</span> <span class='diff-add'> for (;;) {</span> <span class='diff-add'> // Find the part that overlaps with the start of this text</span> <span class='diff-add'> for (var i = 0; i < order.length; i++) {</span> <span class='diff-add'> var part = order[i];</span> <span class='diff-add'> if (part.to > start && part.from <= start) break;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, title);</span> <span class='diff-add'> inner(builder, text.slice(0, part.to - start), style, startStyle, null, title);</span> <span class='diff-add'> startStyle = null;</span> <span class='diff-add'> text = text.slice(part.to - start);</span> <span class='diff-add'> start = part.to;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> function buildCollapsedSpan(builder, size, marker, ignoreWidget) {</span> <span class='diff-add'> var widget = !ignoreWidget && marker.widgetNode;</span> <span class='diff-add'> if (widget) {</span> <span class='diff-add'> builder.map.push(builder.pos, builder.pos + size, widget);</span> <span class='diff-add'> builder.content.appendChild(widget);</span> <span class='diff-add'> }</span> <span class='diff-add'> builder.pos += size;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Outputs a number of spans to make up a line, taking highlighting</span> <span class='diff-add'> // and marked text into account.</span> <span class='diff-add'> function insertLineContent(line, builder, styles) {</span> <span class='diff-add'> var spans = line.markedSpans, allText = line.text, at = 0;</span> <span class='diff-add'> if (!spans) {</span> <span class='diff-add'> for (var i = 1; i < styles.length; i+=2)</span> <span class='diff-add'> builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options));</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var len = allText.length, pos = 0, i = 1, text = "", style, css;</span> <span class='diff-add'> var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;</span> <span class='diff-add'> for (;;) {</span> <span class='diff-add'> if (nextChange == pos) { // Update current marker set</span> <span class='diff-add'> spanStyle = spanEndStyle = spanStartStyle = title = css = "";</span> <span class='diff-add'> collapsed = null; nextChange = Infinity;</span> <span class='diff-add'> var foundBookmarks = [];</span> <span class='diff-add'> for (var j = 0; j < spans.length; ++j) {</span> <span class='diff-add'> var sp = spans[j], m = sp.marker;</span> <span class='diff-add'> if (sp.from <= pos && (sp.to == null || sp.to > pos)) {</span> <span class='diff-add'> if (sp.to != null && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = ""; }</span> <span class='diff-add'> if (m.className) spanStyle += " " + m.className;</span> <span class='diff-add'> if (m.css) css = m.css;</span> <span class='diff-add'> if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle;</span> <span class='diff-add'> if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle;</span> <span class='diff-add'> if (m.title && !title) title = m.title;</span> <span class='diff-add'> if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))</span> <span class='diff-add'> collapsed = sp;</span> <span class='diff-add'> } else if (sp.from > pos && nextChange > sp.from) {</span> <span class='diff-add'> nextChange = sp.from;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (m.type == "bookmark" && sp.from == pos && m.widgetNode) foundBookmarks.push(m);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (collapsed && (collapsed.from || 0) == pos) {</span> <span class='diff-add'> buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,</span> <span class='diff-add'> collapsed.marker, collapsed.from == null);</span> <span class='diff-add'> if (collapsed.to == null) return;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!collapsed && foundBookmarks.length) for (var j = 0; j < foundBookmarks.length; ++j)</span> <span class='diff-add'> buildCollapsedSpan(builder, 0, foundBookmarks[j]);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (pos >= len) break;</span> <span class='diff-add'> var upto = Math.min(len, nextChange);</span> <span class='diff-add'> while (true) {</span> <span class='diff-add'> if (text) {</span> <span class='diff-add'> var end = pos + text.length;</span> <span class='diff-add'> if (!collapsed) {</span> <span class='diff-add'> var tokenText = end > upto ? text.slice(0, upto - pos) : text;</span> <span class='diff-add'> builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,</span> <span class='diff-add'> spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title, css);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}</span> <span class='diff-add'> pos = end;</span> <span class='diff-add'> spanStartStyle = "";</span> <span class='diff-add'> }</span> <span class='diff-add'> text = allText.slice(at, at = styles[i++]);</span> <span class='diff-add'> style = interpretTokenStyle(styles[i++], builder.cm.options);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // DOCUMENT DATA STRUCTURE</span> <span class='diff-add'> // By default, updates that start and end at the beginning of a line</span> <span class='diff-add'> // are treated specially, in order to make the association of line</span> <span class='diff-add'> // widgets and marker elements with the text behave more intuitive.</span> <span class='diff-add'> function isWholeLineUpdate(doc, change) {</span> <span class='diff-add'> return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" &&</span> <span class='diff-add'> (!doc.cm || doc.cm.options.wholeLineUpdateBefore);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Perform a change on the document data structure.</span> <span class='diff-add'> function updateDoc(doc, change, markedSpans, estimateHeight) {</span> <span class='diff-add'> function spansFor(n) {return markedSpans ? markedSpans[n] : null;}</span> <span class='diff-add'> function update(line, text, spans) {</span> <span class='diff-add'> updateLine(line, text, spans, estimateHeight);</span> <span class='diff-add'> signalLater(line, "change", line, change);</span> <span class='diff-add'> }</span> <span class='diff-add'> var from = change.from, to = change.to, text = change.text;</span> <span class='diff-add'> var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);</span> <span class='diff-add'> var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;</span> <span class='diff-add'> // Adjust the line structure</span> <span class='diff-add'> if (isWholeLineUpdate(doc, change)) {</span> <span class='diff-add'> // This is a whole-line replace. Treated specially to make</span> <span class='diff-add'> // sure line objects move the way they are supposed to.</span> <span class='diff-add'> for (var i = 0, added = []; i < text.length - 1; ++i)</span> <span class='diff-add'> added.push(new Line(text[i], spansFor(i), estimateHeight));</span> <span class='diff-add'> update(lastLine, lastLine.text, lastSpans);</span> <span class='diff-add'> if (nlines) doc.remove(from.line, nlines);</span> <span class='diff-add'> if (added.length) doc.insert(from.line, added);</span> <span class='diff-add'> } else if (firstLine == lastLine) {</span> <span class='diff-add'> if (text.length == 1) {</span> <span class='diff-add'> update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> for (var added = [], i = 1; i < text.length - 1; ++i)</span> <span class='diff-add'> added.push(new Line(text[i], spansFor(i), estimateHeight));</span> <span class='diff-add'> added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));</span> <span class='diff-add'> update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));</span> <span class='diff-add'> doc.insert(from.line + 1, added);</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (text.length == 1) {</span> <span class='diff-add'> update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));</span> <span class='diff-add'> doc.remove(from.line + 1, nlines);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));</span> <span class='diff-add'> update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);</span> <span class='diff-add'> for (var i = 1, added = []; i < text.length - 1; ++i)</span> <span class='diff-add'> added.push(new Line(text[i], spansFor(i), estimateHeight));</span> <span class='diff-add'> if (nlines > 1) doc.remove(from.line + 1, nlines - 1);</span> <span class='diff-add'> doc.insert(from.line + 1, added);</span> <span class='diff-add'> }</span> <span class='diff-add'> signalLater(doc, "change", doc, change);</span> <span class='diff-add'> }</span> <span class='diff-add'> // The document is represented as a BTree consisting of leaves, with</span> <span class='diff-add'> // chunk of lines in them, and branches, with up to ten leaves or</span> <span class='diff-add'> // other branch nodes below them. The top node is always a branch</span> <span class='diff-add'> // node, and is the document object itself (meaning it has</span> <span class='diff-add'> // additional methods and properties).</span> <span class='diff-add'> //</span> <span class='diff-add'> // All nodes have parent links. The tree is used both to go from</span> <span class='diff-add'> // line numbers to line objects, and to go from objects to numbers.</span> <span class='diff-add'> // It also indexes by height, and is used to convert between height</span> <span class='diff-add'> // and line object, and to find the total height of the document.</span> <span class='diff-add'> //</span> <span class='diff-add'> // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html</span> <span class='diff-add'> function LeafChunk(lines) {</span> <span class='diff-add'> this.lines = lines;</span> <span class='diff-add'> this.parent = null;</span> <span class='diff-add'> for (var i = 0, height = 0; i < lines.length; ++i) {</span> <span class='diff-add'> lines[i].parent = this;</span> <span class='diff-add'> height += lines[i].height;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.height = height;</span> <span class='diff-add'> }</span> <span class='diff-add'> LeafChunk.prototype = {</span> <span class='diff-add'> chunkSize: function() { return this.lines.length; },</span> <span class='diff-add'> // Remove the n lines at offset 'at'.</span> <span class='diff-add'> removeInner: function(at, n) {</span> <span class='diff-add'> for (var i = at, e = at + n; i < e; ++i) {</span> <span class='diff-add'> var line = this.lines[i];</span> <span class='diff-add'> this.height -= line.height;</span> <span class='diff-add'> cleanUpLine(line);</span> <span class='diff-add'> signalLater(line, "delete");</span> <span class='diff-add'> }</span> <span class='diff-add'> this.lines.splice(at, n);</span> <span class='diff-add'> },</span> <span class='diff-add'> // Helper used to collapse a small branch into a single leaf.</span> <span class='diff-add'> collapse: function(lines) {</span> <span class='diff-add'> lines.push.apply(lines, this.lines);</span> <span class='diff-add'> },</span> <span class='diff-add'> // Insert the given array of lines at offset 'at', count them as</span> <span class='diff-add'> // having the given height.</span> <span class='diff-add'> insertInner: function(at, lines, height) {</span> <span class='diff-add'> this.height += height;</span> <span class='diff-add'> this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));</span> <span class='diff-add'> for (var i = 0; i < lines.length; ++i) lines[i].parent = this;</span> <span class='diff-add'> },</span> <span class='diff-add'> // Used to iterate over a part of the tree.</span> <span class='diff-add'> iterN: function(at, n, op) {</span> <span class='diff-add'> for (var e = at + n; at < e; ++at)</span> <span class='diff-add'> if (op(this.lines[at])) return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> function BranchChunk(children) {</span> <span class='diff-add'> this.children = children;</span> <span class='diff-add'> var size = 0, height = 0;</span> <span class='diff-add'> for (var i = 0; i < children.length; ++i) {</span> <span class='diff-add'> var ch = children[i];</span> <span class='diff-add'> size += ch.chunkSize(); height += ch.height;</span> <span class='diff-add'> ch.parent = this;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.size = size;</span> <span class='diff-add'> this.height = height;</span> <span class='diff-add'> this.parent = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> BranchChunk.prototype = {</span> <span class='diff-add'> chunkSize: function() { return this.size; },</span> <span class='diff-add'> removeInner: function(at, n) {</span> <span class='diff-add'> this.size -= n;</span> <span class='diff-add'> for (var i = 0; i < this.children.length; ++i) {</span> <span class='diff-add'> var child = this.children[i], sz = child.chunkSize();</span> <span class='diff-add'> if (at < sz) {</span> <span class='diff-add'> var rm = Math.min(n, sz - at), oldHeight = child.height;</span> <span class='diff-add'> child.removeInner(at, rm);</span> <span class='diff-add'> this.height -= oldHeight - child.height;</span> <span class='diff-add'> if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }</span> <span class='diff-add'> if ((n -= rm) == 0) break;</span> <span class='diff-add'> at = 0;</span> <span class='diff-add'> } else at -= sz;</span> <span class='diff-add'> }</span> <span class='diff-add'> // If the result is smaller than 25 lines, ensure that it is a</span> <span class='diff-add'> // single leaf node.</span> <span class='diff-add'> if (this.size - n < 25 &&</span> <span class='diff-add'> (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {</span> <span class='diff-add'> var lines = [];</span> <span class='diff-add'> this.collapse(lines);</span> <span class='diff-add'> this.children = [new LeafChunk(lines)];</span> <span class='diff-add'> this.children[0].parent = this;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> collapse: function(lines) {</span> <span class='diff-add'> for (var i = 0; i < this.children.length; ++i) this.children[i].collapse(lines);</span> <span class='diff-add'> },</span> <span class='diff-add'> insertInner: function(at, lines, height) {</span> <span class='diff-add'> this.size += lines.length;</span> <span class='diff-add'> this.height += height;</span> <span class='diff-add'> for (var i = 0; i < this.children.length; ++i) {</span> <span class='diff-add'> var child = this.children[i], sz = child.chunkSize();</span> <span class='diff-add'> if (at <= sz) {</span> <span class='diff-add'> child.insertInner(at, lines, height);</span> <span class='diff-add'> if (child.lines && child.lines.length > 50) {</span> <span class='diff-add'> while (child.lines.length > 50) {</span> <span class='diff-add'> var spilled = child.lines.splice(child.lines.length - 25, 25);</span> <span class='diff-add'> var newleaf = new LeafChunk(spilled);</span> <span class='diff-add'> child.height -= newleaf.height;</span> <span class='diff-add'> this.children.splice(i + 1, 0, newleaf);</span> <span class='diff-add'> newleaf.parent = this;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.maybeSpill();</span> <span class='diff-add'> }</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> at -= sz;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> // When a node has grown, check whether it should be split.</span> <span class='diff-add'> maybeSpill: function() {</span> <span class='diff-add'> if (this.children.length <= 10) return;</span> <span class='diff-add'> var me = this;</span> <span class='diff-add'> do {</span> <span class='diff-add'> var spilled = me.children.splice(me.children.length - 5, 5);</span> <span class='diff-add'> var sibling = new BranchChunk(spilled);</span> <span class='diff-add'> if (!me.parent) { // Become the parent node</span> <span class='diff-add'> var copy = new BranchChunk(me.children);</span> <span class='diff-add'> copy.parent = me;</span> <span class='diff-add'> me.children = [copy, sibling];</span> <span class='diff-add'> me = copy;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> me.size -= sibling.size;</span> <span class='diff-add'> me.height -= sibling.height;</span> <span class='diff-add'> var myIndex = indexOf(me.parent.children, me);</span> <span class='diff-add'> me.parent.children.splice(myIndex + 1, 0, sibling);</span> <span class='diff-add'> }</span> <span class='diff-add'> sibling.parent = me.parent;</span> <span class='diff-add'> } while (me.children.length > 10);</span> <span class='diff-add'> me.parent.maybeSpill();</span> <span class='diff-add'> },</span> <span class='diff-add'> iterN: function(at, n, op) {</span> <span class='diff-add'> for (var i = 0; i < this.children.length; ++i) {</span> <span class='diff-add'> var child = this.children[i], sz = child.chunkSize();</span> <span class='diff-add'> if (at < sz) {</span> <span class='diff-add'> var used = Math.min(n, sz - at);</span> <span class='diff-add'> if (child.iterN(at, used, op)) return true;</span> <span class='diff-add'> if ((n -= used) == 0) break;</span> <span class='diff-add'> at = 0;</span> <span class='diff-add'> } else at -= sz;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var nextDocId = 0;</span> <span class='diff-add'> var Doc = CodeMirror.Doc = function(text, mode, firstLine) {</span> <span class='diff-add'> if (!(this instanceof Doc)) return new Doc(text, mode, firstLine);</span> <span class='diff-add'> if (firstLine == null) firstLine = 0;</span> <span class='diff-add'> BranchChunk.call(this, [new LeafChunk([new Line("", null)])]);</span> <span class='diff-add'> this.first = firstLine;</span> <span class='diff-add'> this.scrollTop = this.scrollLeft = 0;</span> <span class='diff-add'> this.cantEdit = false;</span> <span class='diff-add'> this.cleanGeneration = 1;</span> <span class='diff-add'> this.frontier = firstLine;</span> <span class='diff-add'> var start = Pos(firstLine, 0);</span> <span class='diff-add'> this.sel = simpleSelection(start);</span> <span class='diff-add'> this.history = new History(null);</span> <span class='diff-add'> this.id = ++nextDocId;</span> <span class='diff-add'> this.modeOption = mode;</span> <span class='diff-add'> if (typeof text == "string") text = splitLines(text);</span> <span class='diff-add'> updateDoc(this, {from: start, to: start, text: text});</span> <span class='diff-add'> setSelection(this, simpleSelection(start), sel_dontScroll);</span> <span class='diff-add'> };</span> <span class='diff-add'> Doc.prototype = createObj(BranchChunk.prototype, {</span> <span class='diff-add'> constructor: Doc,</span> <span class='diff-add'> // Iterate over the document. Supports two forms -- with only one</span> <span class='diff-add'> // argument, it calls that for each line in the document. With</span> <span class='diff-add'> // three, it iterates over the range given by the first two (with</span> <span class='diff-add'> // the second being non-inclusive).</span> <span class='diff-add'> iter: function(from, to, op) {</span> <span class='diff-add'> if (op) this.iterN(from - this.first, to - from, op);</span> <span class='diff-add'> else this.iterN(this.first, this.first + this.size, from);</span> <span class='diff-add'> },</span> <span class='diff-add'> // Non-public interface for adding and removing lines.</span> <span class='diff-add'> insert: function(at, lines) {</span> <span class='diff-add'> var height = 0;</span> <span class='diff-add'> for (var i = 0; i < lines.length; ++i) height += lines[i].height;</span> <span class='diff-add'> this.insertInner(at - this.first, lines, height);</span> <span class='diff-add'> },</span> <span class='diff-add'> remove: function(at, n) { this.removeInner(at - this.first, n); },</span> <span class='diff-add'> // From here, the methods are part of the public interface. Most</span> <span class='diff-add'> // are also available from CodeMirror (editor) instances.</span> <span class='diff-add'> getValue: function(lineSep) {</span> <span class='diff-add'> var lines = getLines(this, this.first, this.first + this.size);</span> <span class='diff-add'> if (lineSep === false) return lines;</span> <span class='diff-add'> return lines.join(lineSep || "\n");</span> <span class='diff-add'> },</span> <span class='diff-add'> setValue: docMethodOp(function(code) {</span> <span class='diff-add'> var top = Pos(this.first, 0), last = this.first + this.size - 1;</span> <span class='diff-add'> makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),</span> <span class='diff-add'> text: splitLines(code), origin: "setValue"}, true);</span> <span class='diff-add'> setSelection(this, simpleSelection(top));</span> <span class='diff-add'> }),</span> <span class='diff-add'> replaceRange: function(code, from, to, origin) {</span> <span class='diff-add'> from = clipPos(this, from);</span> <span class='diff-add'> to = to ? clipPos(this, to) : from;</span> <span class='diff-add'> replaceRange(this, code, from, to, origin);</span> <span class='diff-add'> },</span> <span class='diff-add'> getRange: function(from, to, lineSep) {</span> <span class='diff-add'> var lines = getBetween(this, clipPos(this, from), clipPos(this, to));</span> <span class='diff-add'> if (lineSep === false) return lines;</span> <span class='diff-add'> return lines.join(lineSep || "\n");</span> <span class='diff-add'> },</span> <span class='diff-add'> getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;},</span> <span class='diff-add'> getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);},</span> <span class='diff-add'> getLineNumber: function(line) {return lineNo(line);},</span> <span class='diff-add'> getLineHandleVisualStart: function(line) {</span> <span class='diff-add'> if (typeof line == "number") line = getLine(this, line);</span> <span class='diff-add'> return visualLine(line);</span> <span class='diff-add'> },</span> <span class='diff-add'> lineCount: function() {return this.size;},</span> <span class='diff-add'> firstLine: function() {return this.first;},</span> <span class='diff-add'> lastLine: function() {return this.first + this.size - 1;},</span> <span class='diff-add'> clipPos: function(pos) {return clipPos(this, pos);},</span> <span class='diff-add'> getCursor: function(start) {</span> <span class='diff-add'> var range = this.sel.primary(), pos;</span> <span class='diff-add'> if (start == null || start == "head") pos = range.head;</span> <span class='diff-add'> else if (start == "anchor") pos = range.anchor;</span> <span class='diff-add'> else if (start == "end" || start == "to" || start === false) pos = range.to();</span> <span class='diff-add'> else pos = range.from();</span> <span class='diff-add'> return pos;</span> <span class='diff-add'> },</span> <span class='diff-add'> listSelections: function() { return this.sel.ranges; },</span> <span class='diff-add'> somethingSelected: function() {return this.sel.somethingSelected();},</span> <span class='diff-add'> setCursor: docMethodOp(function(line, ch, options) {</span> <span class='diff-add'> setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options);</span> <span class='diff-add'> }),</span> <span class='diff-add'> setSelection: docMethodOp(function(anchor, head, options) {</span> <span class='diff-add'> setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);</span> <span class='diff-add'> }),</span> <span class='diff-add'> extendSelection: docMethodOp(function(head, other, options) {</span> <span class='diff-add'> extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);</span> <span class='diff-add'> }),</span> <span class='diff-add'> extendSelections: docMethodOp(function(heads, options) {</span> <span class='diff-add'> extendSelections(this, clipPosArray(this, heads, options));</span> <span class='diff-add'> }),</span> <span class='diff-add'> extendSelectionsBy: docMethodOp(function(f, options) {</span> <span class='diff-add'> extendSelections(this, map(this.sel.ranges, f), options);</span> <span class='diff-add'> }),</span> <span class='diff-add'> setSelections: docMethodOp(function(ranges, primary, options) {</span> <span class='diff-add'> if (!ranges.length) return;</span> <span class='diff-add'> for (var i = 0, out = []; i < ranges.length; i++)</span> <span class='diff-add'> out[i] = new Range(clipPos(this, ranges[i].anchor),</span> <span class='diff-add'> clipPos(this, ranges[i].head));</span> <span class='diff-add'> if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex);</span> <span class='diff-add'> setSelection(this, normalizeSelection(out, primary), options);</span> <span class='diff-add'> }),</span> <span class='diff-add'> addSelection: docMethodOp(function(anchor, head, options) {</span> <span class='diff-add'> var ranges = this.sel.ranges.slice(0);</span> <span class='diff-add'> ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));</span> <span class='diff-add'> setSelection(this, normalizeSelection(ranges, ranges.length - 1), options);</span> <span class='diff-add'> }),</span> <span class='diff-add'> getSelection: function(lineSep) {</span> <span class='diff-add'> var ranges = this.sel.ranges, lines;</span> <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span> <span class='diff-add'> var sel = getBetween(this, ranges[i].from(), ranges[i].to());</span> <span class='diff-add'> lines = lines ? lines.concat(sel) : sel;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (lineSep === false) return lines;</span> <span class='diff-add'> else return lines.join(lineSep || "\n");</span> <span class='diff-add'> },</span> <span class='diff-add'> getSelections: function(lineSep) {</span> <span class='diff-add'> var parts = [], ranges = this.sel.ranges;</span> <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span> <span class='diff-add'> var sel = getBetween(this, ranges[i].from(), ranges[i].to());</span> <span class='diff-add'> if (lineSep !== false) sel = sel.join(lineSep || "\n");</span> <span class='diff-add'> parts[i] = sel;</span> <span class='diff-add'> }</span> <span class='diff-add'> return parts;</span> <span class='diff-add'> },</span> <span class='diff-add'> replaceSelection: function(code, collapse, origin) {</span> <span class='diff-add'> var dup = [];</span> <span class='diff-add'> for (var i = 0; i < this.sel.ranges.length; i++)</span> <span class='diff-add'> dup[i] = code;</span> <span class='diff-add'> this.replaceSelections(dup, collapse, origin || "+input");</span> <span class='diff-add'> },</span> <span class='diff-add'> replaceSelections: docMethodOp(function(code, collapse, origin) {</span> <span class='diff-add'> var changes = [], sel = this.sel;</span> <span class='diff-add'> for (var i = 0; i < sel.ranges.length; i++) {</span> <span class='diff-add'> var range = sel.ranges[i];</span> <span class='diff-add'> changes[i] = {from: range.from(), to: range.to(), text: splitLines(code[i]), origin: origin};</span> <span class='diff-add'> }</span> <span class='diff-add'> var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse);</span> <span class='diff-add'> for (var i = changes.length - 1; i >= 0; i--)</span> <span class='diff-add'> makeChange(this, changes[i]);</span> <span class='diff-add'> if (newSel) setSelectionReplaceHistory(this, newSel);</span> <span class='diff-add'> else if (this.cm) ensureCursorVisible(this.cm);</span> <span class='diff-add'> }),</span> <span class='diff-add'> undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}),</span> <span class='diff-add'> redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}),</span> <span class='diff-add'> undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}),</span> <span class='diff-add'> redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}),</span> <span class='diff-add'> setExtending: function(val) {this.extend = val;},</span> <span class='diff-add'> getExtending: function() {return this.extend;},</span> <span class='diff-add'> historySize: function() {</span> <span class='diff-add'> var hist = this.history, done = 0, undone = 0;</span> <span class='diff-add'> for (var i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done;</span> <span class='diff-add'> for (var i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone;</span> <span class='diff-add'> return {undo: done, redo: undone};</span> <span class='diff-add'> },</span> <span class='diff-add'> clearHistory: function() {this.history = new History(this.history.maxGeneration);},</span> <span class='diff-add'> markClean: function() {</span> <span class='diff-add'> this.cleanGeneration = this.changeGeneration(true);</span> <span class='diff-add'> },</span> <span class='diff-add'> changeGeneration: function(forceSplit) {</span> <span class='diff-add'> if (forceSplit)</span> <span class='diff-add'> this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null;</span> <span class='diff-add'> return this.history.generation;</span> <span class='diff-add'> },</span> <span class='diff-add'> isClean: function (gen) {</span> <span class='diff-add'> return this.history.generation == (gen || this.cleanGeneration);</span> <span class='diff-add'> },</span> <span class='diff-add'> getHistory: function() {</span> <span class='diff-add'> return {done: copyHistoryArray(this.history.done),</span> <span class='diff-add'> undone: copyHistoryArray(this.history.undone)};</span> <span class='diff-add'> },</span> <span class='diff-add'> setHistory: function(histData) {</span> <span class='diff-add'> var hist = this.history = new History(this.history.maxGeneration);</span> <span class='diff-add'> hist.done = copyHistoryArray(histData.done.slice(0), null, true);</span> <span class='diff-add'> hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);</span> <span class='diff-add'> },</span> <span class='diff-add'> addLineClass: docMethodOp(function(handle, where, cls) {</span> <span class='diff-add'> return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) {</span> <span class='diff-add'> var prop = where == "text" ? "textClass"</span> <span class='diff-add'> : where == "background" ? "bgClass"</span> <span class='diff-add'> : where == "gutter" ? "gutterClass" : "wrapClass";</span> <span class='diff-add'> if (!line[prop]) line[prop] = cls;</span> <span class='diff-add'> else if (classTest(cls).test(line[prop])) return false;</span> <span class='diff-add'> else line[prop] += " " + cls;</span> <span class='diff-add'> return true;</span> <span class='diff-add'> });</span> <span class='diff-add'> }),</span> <span class='diff-add'> removeLineClass: docMethodOp(function(handle, where, cls) {</span> <span class='diff-add'> return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) {</span> <span class='diff-add'> var prop = where == "text" ? "textClass"</span> <span class='diff-add'> : where == "background" ? "bgClass"</span> <span class='diff-add'> : where == "gutter" ? "gutterClass" : "wrapClass";</span> <span class='diff-add'> var cur = line[prop];</span> <span class='diff-add'> if (!cur) return false;</span> <span class='diff-add'> else if (cls == null) line[prop] = null;</span> <span class='diff-add'> else {</span> <span class='diff-add'> var found = cur.match(classTest(cls));</span> <span class='diff-add'> if (!found) return false;</span> <span class='diff-add'> var end = found.index + found[0].length;</span> <span class='diff-add'> line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null;</span> <span class='diff-add'> }</span> <span class='diff-add'> return true;</span> <span class='diff-add'> });</span> <span class='diff-add'> }),</span> <span class='diff-add'> markText: function(from, to, options) {</span> <span class='diff-add'> return markText(this, clipPos(this, from), clipPos(this, to), options, "range");</span> <span class='diff-add'> },</span> <span class='diff-add'> setBookmark: function(pos, options) {</span> <span class='diff-add'> var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),</span> <span class='diff-add'> insertLeft: options && options.insertLeft,</span> <span class='diff-add'> clearWhenEmpty: false, shared: options && options.shared};</span> <span class='diff-add'> pos = clipPos(this, pos);</span> <span class='diff-add'> return markText(this, pos, pos, realOpts, "bookmark");</span> <span class='diff-add'> },</span> <span class='diff-add'> findMarksAt: function(pos) {</span> <span class='diff-add'> pos = clipPos(this, pos);</span> <span class='diff-add'> var markers = [], spans = getLine(this, pos.line).markedSpans;</span> <span class='diff-add'> if (spans) for (var i = 0; i < spans.length; ++i) {</span> <span class='diff-add'> var span = spans[i];</span> <span class='diff-add'> if ((span.from == null || span.from <= pos.ch) &&</span> <span class='diff-add'> (span.to == null || span.to >= pos.ch))</span> <span class='diff-add'> markers.push(span.marker.parent || span.marker);</span> <span class='diff-add'> }</span> <span class='diff-add'> return markers;</span> <span class='diff-add'> },</span> <span class='diff-add'> findMarks: function(from, to, filter) {</span> <span class='diff-add'> from = clipPos(this, from); to = clipPos(this, to);</span> <span class='diff-add'> var found = [], lineNo = from.line;</span> <span class='diff-add'> this.iter(from.line, to.line + 1, function(line) {</span> <span class='diff-add'> var spans = line.markedSpans;</span> <span class='diff-add'> if (spans) for (var i = 0; i < spans.length; i++) {</span> <span class='diff-add'> var span = spans[i];</span> <span class='diff-add'> if (!(lineNo == from.line && from.ch > span.to ||</span> <span class='diff-add'> span.from == null && lineNo != from.line||</span> <span class='diff-add'> lineNo == to.line && span.from > to.ch) &&</span> <span class='diff-add'> (!filter || filter(span.marker)))</span> <span class='diff-add'> found.push(span.marker.parent || span.marker);</span> <span class='diff-add'> }</span> <span class='diff-add'> ++lineNo;</span> <span class='diff-add'> });</span> <span class='diff-add'> return found;</span> <span class='diff-add'> },</span> <span class='diff-add'> getAllMarks: function() {</span> <span class='diff-add'> var markers = [];</span> <span class='diff-add'> this.iter(function(line) {</span> <span class='diff-add'> var sps = line.markedSpans;</span> <span class='diff-add'> if (sps) for (var i = 0; i < sps.length; ++i)</span> <span class='diff-add'> if (sps[i].from != null) markers.push(sps[i].marker);</span> <span class='diff-add'> });</span> <span class='diff-add'> return markers;</span> <span class='diff-add'> },</span> <span class='diff-add'> posFromIndex: function(off) {</span> <span class='diff-add'> var ch, lineNo = this.first;</span> <span class='diff-add'> this.iter(function(line) {</span> <span class='diff-add'> var sz = line.text.length + 1;</span> <span class='diff-add'> if (sz > off) { ch = off; return true; }</span> <span class='diff-add'> off -= sz;</span> <span class='diff-add'> ++lineNo;</span> <span class='diff-add'> });</span> <span class='diff-add'> return clipPos(this, Pos(lineNo, ch));</span> <span class='diff-add'> },</span> <span class='diff-add'> indexFromPos: function (coords) {</span> <span class='diff-add'> coords = clipPos(this, coords);</span> <span class='diff-add'> var index = coords.ch;</span> <span class='diff-add'> if (coords.line < this.first || coords.ch < 0) return 0;</span> <span class='diff-add'> this.iter(this.first, coords.line, function (line) {</span> <span class='diff-add'> index += line.text.length + 1;</span> <span class='diff-add'> });</span> <span class='diff-add'> return index;</span> <span class='diff-add'> },</span> <span class='diff-add'> copy: function(copyHistory) {</span> <span class='diff-add'> var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first);</span> <span class='diff-add'> doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;</span> <span class='diff-add'> doc.sel = this.sel;</span> <span class='diff-add'> doc.extend = false;</span> <span class='diff-add'> if (copyHistory) {</span> <span class='diff-add'> doc.history.undoDepth = this.history.undoDepth;</span> <span class='diff-add'> doc.setHistory(this.getHistory());</span> <span class='diff-add'> }</span> <span class='diff-add'> return doc;</span> <span class='diff-add'> },</span> <span class='diff-add'> linkedDoc: function(options) {</span> <span class='diff-add'> if (!options) options = {};</span> <span class='diff-add'> var from = this.first, to = this.first + this.size;</span> <span class='diff-add'> if (options.from != null && options.from > from) from = options.from;</span> <span class='diff-add'> if (options.to != null && options.to < to) to = options.to;</span> <span class='diff-add'> var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from);</span> <span class='diff-add'> if (options.sharedHist) copy.history = this.history;</span> <span class='diff-add'> (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});</span> <span class='diff-add'> copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];</span> <span class='diff-add'> copySharedMarkers(copy, findSharedMarkers(this));</span> <span class='diff-add'> return copy;</span> <span class='diff-add'> },</span> <span class='diff-add'> unlinkDoc: function(other) {</span> <span class='diff-add'> if (other instanceof CodeMirror) other = other.doc;</span> <span class='diff-add'> if (this.linked) for (var i = 0; i < this.linked.length; ++i) {</span> <span class='diff-add'> var link = this.linked[i];</span> <span class='diff-add'> if (link.doc != other) continue;</span> <span class='diff-add'> this.linked.splice(i, 1);</span> <span class='diff-add'> other.unlinkDoc(this);</span> <span class='diff-add'> detachSharedMarkers(findSharedMarkers(this));</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> // If the histories were shared, split them again</span> <span class='diff-add'> if (other.history == this.history) {</span> <span class='diff-add'> var splitIds = [other.id];</span> <span class='diff-add'> linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true);</span> <span class='diff-add'> other.history = new History(null);</span> <span class='diff-add'> other.history.done = copyHistoryArray(this.history.done, splitIds);</span> <span class='diff-add'> other.history.undone = copyHistoryArray(this.history.undone, splitIds);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> iterLinkedDocs: function(f) {linkedDocs(this, f);},</span> <span class='diff-add'> getMode: function() {return this.mode;},</span> <span class='diff-add'> getEditor: function() {return this.cm;}</span> <span class='diff-add'> });</span> <span class='diff-add'> // Public alias.</span> <span class='diff-add'> Doc.prototype.eachLine = Doc.prototype.iter;</span> <span class='diff-add'> // Set up methods on CodeMirror's prototype to redirect to the editor's document.</span> <span class='diff-add'> var dontDelegate = "iter insert remove copy getEditor".split(" ");</span> <span class='diff-add'> for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)</span> <span class='diff-add'> CodeMirror.prototype[prop] = (function(method) {</span> <span class='diff-add'> return function() {return method.apply(this.doc, arguments);};</span> <span class='diff-add'> })(Doc.prototype[prop]);</span> <span class='diff-add'> eventMixin(Doc);</span> <span class='diff-add'> // Call f for all linked documents.</span> <span class='diff-add'> function linkedDocs(doc, f, sharedHistOnly) {</span> <span class='diff-add'> function propagate(doc, skip, sharedHist) {</span> <span class='diff-add'> if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) {</span> <span class='diff-add'> var rel = doc.linked[i];</span> <span class='diff-add'> if (rel.doc == skip) continue;</span> <span class='diff-add'> var shared = sharedHist && rel.sharedHist;</span> <span class='diff-add'> if (sharedHistOnly && !shared) continue;</span> <span class='diff-add'> f(rel.doc, shared);</span> <span class='diff-add'> propagate(rel.doc, doc, shared);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> propagate(doc, null, true);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Attach a document to an editor.</span> <span class='diff-add'> function attachDoc(cm, doc) {</span> <span class='diff-add'> if (doc.cm) throw new Error("This document is already in use.");</span> <span class='diff-add'> cm.doc = doc;</span> <span class='diff-add'> doc.cm = cm;</span> <span class='diff-add'> estimateLineHeights(cm);</span> <span class='diff-add'> loadMode(cm);</span> <span class='diff-add'> if (!cm.options.lineWrapping) findMaxLine(cm);</span> <span class='diff-add'> cm.options.mode = doc.modeOption;</span> <span class='diff-add'> regChange(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> // LINE UTILITIES</span> <span class='diff-add'> // Find the line object corresponding to the given line number.</span> <span class='diff-add'> function getLine(doc, n) {</span> <span class='diff-add'> n -= doc.first;</span> <span class='diff-add'> if (n < 0 || n >= doc.size) throw new Error("There is no line " + (n + doc.first) + " in the document.");</span> <span class='diff-add'> for (var chunk = doc; !chunk.lines;) {</span> <span class='diff-add'> for (var i = 0;; ++i) {</span> <span class='diff-add'> var child = chunk.children[i], sz = child.chunkSize();</span> <span class='diff-add'> if (n < sz) { chunk = child; break; }</span> <span class='diff-add'> n -= sz;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return chunk.lines[n];</span> <span class='diff-add'> }</span> <span class='diff-add'> // Get the part of a document between two positions, as an array of</span> <span class='diff-add'> // strings.</span> <span class='diff-add'> function getBetween(doc, start, end) {</span> <span class='diff-add'> var out = [], n = start.line;</span> <span class='diff-add'> doc.iter(start.line, end.line + 1, function(line) {</span> <span class='diff-add'> var text = line.text;</span> <span class='diff-add'> if (n == end.line) text = text.slice(0, end.ch);</span> <span class='diff-add'> if (n == start.line) text = text.slice(start.ch);</span> <span class='diff-add'> out.push(text);</span> <span class='diff-add'> ++n;</span> <span class='diff-add'> });</span> <span class='diff-add'> return out;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Get the lines between from and to, as array of strings.</span> <span class='diff-add'> function getLines(doc, from, to) {</span> <span class='diff-add'> var out = [];</span> <span class='diff-add'> doc.iter(from, to, function(line) { out.push(line.text); });</span> <span class='diff-add'> return out;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Update the height of a line, propagating the height change</span> <span class='diff-add'> // upwards to parent nodes.</span> <span class='diff-add'> function updateLineHeight(line, height) {</span> <span class='diff-add'> var diff = height - line.height;</span> <span class='diff-add'> if (diff) for (var n = line; n; n = n.parent) n.height += diff;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Given a line object, find its line number by walking up through</span> <span class='diff-add'> // its parent links.</span> <span class='diff-add'> function lineNo(line) {</span> <span class='diff-add'> if (line.parent == null) return null;</span> <span class='diff-add'> var cur = line.parent, no = indexOf(cur.lines, line);</span> <span class='diff-add'> for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {</span> <span class='diff-add'> for (var i = 0;; ++i) {</span> <span class='diff-add'> if (chunk.children[i] == cur) break;</span> <span class='diff-add'> no += chunk.children[i].chunkSize();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return no + cur.first;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Find the line at the given vertical position, using the height</span> <span class='diff-add'> // information in the document tree.</span> <span class='diff-add'> function lineAtHeight(chunk, h) {</span> <span class='diff-add'> var n = chunk.first;</span> <span class='diff-add'> outer: do {</span> <span class='diff-add'> for (var i = 0; i < chunk.children.length; ++i) {</span> <span class='diff-add'> var child = chunk.children[i], ch = child.height;</span> <span class='diff-add'> if (h < ch) { chunk = child; continue outer; }</span> <span class='diff-add'> h -= ch;</span> <span class='diff-add'> n += child.chunkSize();</span> <span class='diff-add'> }</span> <span class='diff-add'> return n;</span> <span class='diff-add'> } while (!chunk.lines);</span> <span class='diff-add'> for (var i = 0; i < chunk.lines.length; ++i) {</span> <span class='diff-add'> var line = chunk.lines[i], lh = line.height;</span> <span class='diff-add'> if (h < lh) break;</span> <span class='diff-add'> h -= lh;</span> <span class='diff-add'> }</span> <span class='diff-add'> return n + i;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Find the height above the given line.</span> <span class='diff-add'> function heightAtLine(lineObj) {</span> <span class='diff-add'> lineObj = visualLine(lineObj);</span> <span class='diff-add'> var h = 0, chunk = lineObj.parent;</span> <span class='diff-add'> for (var i = 0; i < chunk.lines.length; ++i) {</span> <span class='diff-add'> var line = chunk.lines[i];</span> <span class='diff-add'> if (line == lineObj) break;</span> <span class='diff-add'> else h += line.height;</span> <span class='diff-add'> }</span> <span class='diff-add'> for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {</span> <span class='diff-add'> for (var i = 0; i < p.children.length; ++i) {</span> <span class='diff-add'> var cur = p.children[i];</span> <span class='diff-add'> if (cur == chunk) break;</span> <span class='diff-add'> else h += cur.height;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return h;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Get the bidi ordering for the given line (and cache it). Returns</span> <span class='diff-add'> // false for lines that are fully left-to-right, and an array of</span> <span class='diff-add'> // BidiSpan objects otherwise.</span> <span class='diff-add'> function getOrder(line) {</span> <span class='diff-add'> var order = line.order;</span> <span class='diff-add'> if (order == null) order = line.order = bidiOrdering(line.text);</span> <span class='diff-add'> return order;</span> <span class='diff-add'> }</span> <span class='diff-add'> // HISTORY</span> <span class='diff-add'> function History(startGen) {</span> <span class='diff-add'> // Arrays of change events and selections. Doing something adds an</span> <span class='diff-add'> // event to done and clears undo. Undoing moves events from done</span> <span class='diff-add'> // to undone, redoing moves them in the other direction.</span> <span class='diff-add'> this.done = []; this.undone = [];</span> <span class='diff-add'> this.undoDepth = Infinity;</span> <span class='diff-add'> // Used to track when changes can be merged into a single undo</span> <span class='diff-add'> // event</span> <span class='diff-add'> this.lastModTime = this.lastSelTime = 0;</span> <span class='diff-add'> this.lastOp = this.lastSelOp = null;</span> <span class='diff-add'> this.lastOrigin = this.lastSelOrigin = null;</span> <span class='diff-add'> // Used by the isClean() method</span> <span class='diff-add'> this.generation = this.maxGeneration = startGen || 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Create a history change event from an updateDoc-style change</span> <span class='diff-add'> // object.</span> <span class='diff-add'> function historyChangeFromChange(doc, change) {</span> <span class='diff-add'> var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};</span> <span class='diff-add'> attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);</span> <span class='diff-add'> linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true);</span> <span class='diff-add'> return histChange;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Pop all selection events off the end of a history array. Stop at</span> <span class='diff-add'> // a change event.</span> <span class='diff-add'> function clearSelectionEvents(array) {</span> <span class='diff-add'> while (array.length) {</span> <span class='diff-add'> var last = lst(array);</span> <span class='diff-add'> if (last.ranges) array.pop();</span> <span class='diff-add'> else break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Find the top change event in the history. Pop off selection</span> <span class='diff-add'> // events that are in the way.</span> <span class='diff-add'> function lastChangeEvent(hist, force) {</span> <span class='diff-add'> if (force) {</span> <span class='diff-add'> clearSelectionEvents(hist.done);</span> <span class='diff-add'> return lst(hist.done);</span> <span class='diff-add'> } else if (hist.done.length && !lst(hist.done).ranges) {</span> <span class='diff-add'> return lst(hist.done);</span> <span class='diff-add'> } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {</span> <span class='diff-add'> hist.done.pop();</span> <span class='diff-add'> return lst(hist.done);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Register a change in the history. Merges changes that are within</span> <span class='diff-add'> // a single operation, ore are close together with an origin that</span> <span class='diff-add'> // allows merging (starting with "+") into a single event.</span> <span class='diff-add'> function addChangeToHistory(doc, change, selAfter, opId) {</span> <span class='diff-add'> var hist = doc.history;</span> <span class='diff-add'> hist.undone.length = 0;</span> <span class='diff-add'> var time = +new Date, cur;</span> <span class='diff-add'> if ((hist.lastOp == opId ||</span> <span class='diff-add'> hist.lastOrigin == change.origin && change.origin &&</span> <span class='diff-add'> ((change.origin.charAt(0) == "+" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) ||</span> <span class='diff-add'> change.origin.charAt(0) == "*")) &&</span> <span class='diff-add'> (cur = lastChangeEvent(hist, hist.lastOp == opId))) {</span> <span class='diff-add'> // Merge this change into the last event</span> <span class='diff-add'> var last = lst(cur.changes);</span> <span class='diff-add'> if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {</span> <span class='diff-add'> // Optimized case for simple insertion -- don't want to add</span> <span class='diff-add'> // new changesets for every character typed</span> <span class='diff-add'> last.to = changeEnd(change);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // Add new sub-event</span> <span class='diff-add'> cur.changes.push(historyChangeFromChange(doc, change));</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // Can not be merged, start a new event.</span> <span class='diff-add'> var before = lst(hist.done);</span> <span class='diff-add'> if (!before || !before.ranges)</span> <span class='diff-add'> pushSelectionToHistory(doc.sel, hist.done);</span> <span class='diff-add'> cur = {changes: [historyChangeFromChange(doc, change)],</span> <span class='diff-add'> generation: hist.generation};</span> <span class='diff-add'> hist.done.push(cur);</span> <span class='diff-add'> while (hist.done.length > hist.undoDepth) {</span> <span class='diff-add'> hist.done.shift();</span> <span class='diff-add'> if (!hist.done[0].ranges) hist.done.shift();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> hist.done.push(selAfter);</span> <span class='diff-add'> hist.generation = ++hist.maxGeneration;</span> <span class='diff-add'> hist.lastModTime = hist.lastSelTime = time;</span> <span class='diff-add'> hist.lastOp = hist.lastSelOp = opId;</span> <span class='diff-add'> hist.lastOrigin = hist.lastSelOrigin = change.origin;</span> <span class='diff-add'> if (!last) signal(doc, "historyAdded");</span> <span class='diff-add'> }</span> <span class='diff-add'> function selectionEventCanBeMerged(doc, origin, prev, sel) {</span> <span class='diff-add'> var ch = origin.charAt(0);</span> <span class='diff-add'> return ch == "*" ||</span> <span class='diff-add'> ch == "+" &&</span> <span class='diff-add'> prev.ranges.length == sel.ranges.length &&</span> <span class='diff-add'> prev.somethingSelected() == sel.somethingSelected() &&</span> <span class='diff-add'> new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Called whenever the selection changes, sets the new selection as</span> <span class='diff-add'> // the pending selection in the history, and pushes the old pending</span> <span class='diff-add'> // selection into the 'done' array when it was significantly</span> <span class='diff-add'> // different (in number of selected ranges, emptiness, or time).</span> <span class='diff-add'> function addSelectionToHistory(doc, sel, opId, options) {</span> <span class='diff-add'> var hist = doc.history, origin = options && options.origin;</span> <span class='diff-add'> // A new event is started when the previous origin does not match</span> <span class='diff-add'> // the current, or the origins don't allow matching. Origins</span> <span class='diff-add'> // starting with * are always merged, those starting with + are</span> <span class='diff-add'> // merged when similar and close together in time.</span> <span class='diff-add'> if (opId == hist.lastSelOp ||</span> <span class='diff-add'> (origin && hist.lastSelOrigin == origin &&</span> <span class='diff-add'> (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||</span> <span class='diff-add'> selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))</span> <span class='diff-add'> hist.done[hist.done.length - 1] = sel;</span> <span class='diff-add'> else</span> <span class='diff-add'> pushSelectionToHistory(sel, hist.done);</span> <span class='diff-add'> hist.lastSelTime = +new Date;</span> <span class='diff-add'> hist.lastSelOrigin = origin;</span> <span class='diff-add'> hist.lastSelOp = opId;</span> <span class='diff-add'> if (options && options.clearRedo !== false)</span> <span class='diff-add'> clearSelectionEvents(hist.undone);</span> <span class='diff-add'> }</span> <span class='diff-add'> function pushSelectionToHistory(sel, dest) {</span> <span class='diff-add'> var top = lst(dest);</span> <span class='diff-add'> if (!(top && top.ranges && top.equals(sel)))</span> <span class='diff-add'> dest.push(sel);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Used to store marked span information in the history.</span> <span class='diff-add'> function attachLocalSpans(doc, change, from, to) {</span> <span class='diff-add'> var existing = change["spans_" + doc.id], n = 0;</span> <span class='diff-add'> doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) {</span> <span class='diff-add'> if (line.markedSpans)</span> <span class='diff-add'> (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans;</span> <span class='diff-add'> ++n;</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> // When un/re-doing restores text containing marked spans, those</span> <span class='diff-add'> // that have been explicitly cleared should not be restored.</span> <span class='diff-add'> function removeClearedSpans(spans) {</span> <span class='diff-add'> if (!spans) return null;</span> <span class='diff-add'> for (var i = 0, out; i < spans.length; ++i) {</span> <span class='diff-add'> if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); }</span> <span class='diff-add'> else if (out) out.push(spans[i]);</span> <span class='diff-add'> }</span> <span class='diff-add'> return !out ? spans : out.length ? out : null;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Retrieve and filter the old marked spans stored in a change event.</span> <span class='diff-add'> function getOldSpans(doc, change) {</span> <span class='diff-add'> var found = change["spans_" + doc.id];</span> <span class='diff-add'> if (!found) return null;</span> <span class='diff-add'> for (var i = 0, nw = []; i < change.text.length; ++i)</span> <span class='diff-add'> nw.push(removeClearedSpans(found[i]));</span> <span class='diff-add'> return nw;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Used both to provide a JSON-safe object in .getHistory, and, when</span> <span class='diff-add'> // detaching a document, to split the history in two</span> <span class='diff-add'> function copyHistoryArray(events, newGroup, instantiateSel) {</span> <span class='diff-add'> for (var i = 0, copy = []; i < events.length; ++i) {</span> <span class='diff-add'> var event = events[i];</span> <span class='diff-add'> if (event.ranges) {</span> <span class='diff-add'> copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> var changes = event.changes, newChanges = [];</span> <span class='diff-add'> copy.push({changes: newChanges});</span> <span class='diff-add'> for (var j = 0; j < changes.length; ++j) {</span> <span class='diff-add'> var change = changes[j], m;</span> <span class='diff-add'> newChanges.push({from: change.from, to: change.to, text: change.text});</span> <span class='diff-add'> if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) {</span> <span class='diff-add'> if (indexOf(newGroup, Number(m[1])) > -1) {</span> <span class='diff-add'> lst(newChanges)[prop] = change[prop];</span> <span class='diff-add'> delete change[prop];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return copy;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Rebasing/resetting history to deal with externally-sourced changes</span> <span class='diff-add'> function rebaseHistSelSingle(pos, from, to, diff) {</span> <span class='diff-add'> if (to < pos.line) {</span> <span class='diff-add'> pos.line += diff;</span> <span class='diff-add'> } else if (from < pos.line) {</span> <span class='diff-add'> pos.line = from;</span> <span class='diff-add'> pos.ch = 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Tries to rebase an array of history events given a change in the</span> <span class='diff-add'> // document. If the change touches the same lines as the event, the</span> <span class='diff-add'> // event, and everything 'behind' it, is discarded. If the change is</span> <span class='diff-add'> // before the event, the event's positions are updated. Uses a</span> <span class='diff-add'> // copy-on-write scheme for the positions, to avoid having to</span> <span class='diff-add'> // reallocate them all on every rebase, but also avoid problems with</span> <span class='diff-add'> // shared position objects being unsafely updated.</span> <span class='diff-add'> function rebaseHistArray(array, from, to, diff) {</span> <span class='diff-add'> for (var i = 0; i < array.length; ++i) {</span> <span class='diff-add'> var sub = array[i], ok = true;</span> <span class='diff-add'> if (sub.ranges) {</span> <span class='diff-add'> if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }</span> <span class='diff-add'> for (var j = 0; j < sub.ranges.length; j++) {</span> <span class='diff-add'> rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);</span> <span class='diff-add'> rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);</span> <span class='diff-add'> }</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> for (var j = 0; j < sub.changes.length; ++j) {</span> <span class='diff-add'> var cur = sub.changes[j];</span> <span class='diff-add'> if (to < cur.from.line) {</span> <span class='diff-add'> cur.from = Pos(cur.from.line + diff, cur.from.ch);</span> <span class='diff-add'> cur.to = Pos(cur.to.line + diff, cur.to.ch);</span> <span class='diff-add'> } else if (from <= cur.to.line) {</span> <span class='diff-add'> ok = false;</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!ok) {</span> <span class='diff-add'> array.splice(0, i + 1);</span> <span class='diff-add'> i = 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function rebaseHist(hist, change) {</span> <span class='diff-add'> var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;</span> <span class='diff-add'> rebaseHistArray(hist.done, from, to, diff);</span> <span class='diff-add'> rebaseHistArray(hist.undone, from, to, diff);</span> <span class='diff-add'> }</span> <span class='diff-add'> // EVENT UTILITIES</span> <span class='diff-add'> // Due to the fact that we still support jurassic IE versions, some</span> <span class='diff-add'> // compatibility wrappers are needed.</span> <span class='diff-add'> var e_preventDefault = CodeMirror.e_preventDefault = function(e) {</span> <span class='diff-add'> if (e.preventDefault) e.preventDefault();</span> <span class='diff-add'> else e.returnValue = false;</span> <span class='diff-add'> };</span> <span class='diff-add'> var e_stopPropagation = CodeMirror.e_stopPropagation = function(e) {</span> <span class='diff-add'> if (e.stopPropagation) e.stopPropagation();</span> <span class='diff-add'> else e.cancelBubble = true;</span> <span class='diff-add'> };</span> <span class='diff-add'> function e_defaultPrevented(e) {</span> <span class='diff-add'> return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false;</span> <span class='diff-add'> }</span> <span class='diff-add'> var e_stop = CodeMirror.e_stop = function(e) {e_preventDefault(e); e_stopPropagation(e);};</span> <span class='diff-add'> function e_target(e) {return e.target || e.srcElement;}</span> <span class='diff-add'> function e_button(e) {</span> <span class='diff-add'> var b = e.which;</span> <span class='diff-add'> if (b == null) {</span> <span class='diff-add'> if (e.button & 1) b = 1;</span> <span class='diff-add'> else if (e.button & 2) b = 3;</span> <span class='diff-add'> else if (e.button & 4) b = 2;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (mac && e.ctrlKey && b == 1) b = 3;</span> <span class='diff-add'> return b;</span> <span class='diff-add'> }</span> <span class='diff-add'> // EVENT HANDLING</span> <span class='diff-add'> // Lightweight event framework. on/off also work on DOM nodes,</span> <span class='diff-add'> // registering native DOM handlers.</span> <span class='diff-add'> var on = CodeMirror.on = function(emitter, type, f) {</span> <span class='diff-add'> if (emitter.addEventListener)</span> <span class='diff-add'> emitter.addEventListener(type, f, false);</span> <span class='diff-add'> else if (emitter.attachEvent)</span> <span class='diff-add'> emitter.attachEvent("on" + type, f);</span> <span class='diff-add'> else {</span> <span class='diff-add'> var map = emitter._handlers || (emitter._handlers = {});</span> <span class='diff-add'> var arr = map[type] || (map[type] = []);</span> <span class='diff-add'> arr.push(f);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var off = CodeMirror.off = function(emitter, type, f) {</span> <span class='diff-add'> if (emitter.removeEventListener)</span> <span class='diff-add'> emitter.removeEventListener(type, f, false);</span> <span class='diff-add'> else if (emitter.detachEvent)</span> <span class='diff-add'> emitter.detachEvent("on" + type, f);</span> <span class='diff-add'> else {</span> <span class='diff-add'> var arr = emitter._handlers && emitter._handlers[type];</span> <span class='diff-add'> if (!arr) return;</span> <span class='diff-add'> for (var i = 0; i < arr.length; ++i)</span> <span class='diff-add'> if (arr[i] == f) { arr.splice(i, 1); break; }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var signal = CodeMirror.signal = function(emitter, type /*, values...*/) {</span> <span class='diff-add'> var arr = emitter._handlers && emitter._handlers[type];</span> <span class='diff-add'> if (!arr) return;</span> <span class='diff-add'> var args = Array.prototype.slice.call(arguments, 2);</span> <span class='diff-add'> for (var i = 0; i < arr.length; ++i) arr[i].apply(null, args);</span> <span class='diff-add'> };</span> <span class='diff-add'> var orphanDelayedCallbacks = null;</span> <span class='diff-add'> // Often, we want to signal events at a point where we are in the</span> <span class='diff-add'> // middle of some work, but don't want the handler to start calling</span> <span class='diff-add'> // other methods on the editor, which might be in an inconsistent</span> <span class='diff-add'> // state or simply not expect any other events to happen.</span> <span class='diff-add'> // signalLater looks whether there are any handlers, and schedules</span> <span class='diff-add'> // them to be executed when the last operation ends, or, if no</span> <span class='diff-add'> // operation is active, when a timeout fires.</span> <span class='diff-add'> function signalLater(emitter, type /*, values...*/) {</span> <span class='diff-add'> var arr = emitter._handlers && emitter._handlers[type];</span> <span class='diff-add'> if (!arr) return;</span> <span class='diff-add'> var args = Array.prototype.slice.call(arguments, 2), list;</span> <span class='diff-add'> if (operationGroup) {</span> <span class='diff-add'> list = operationGroup.delayedCallbacks;</span> <span class='diff-add'> } else if (orphanDelayedCallbacks) {</span> <span class='diff-add'> list = orphanDelayedCallbacks;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> list = orphanDelayedCallbacks = [];</span> <span class='diff-add'> setTimeout(fireOrphanDelayed, 0);</span> <span class='diff-add'> }</span> <span class='diff-add'> function bnd(f) {return function(){f.apply(null, args);};};</span> <span class='diff-add'> for (var i = 0; i < arr.length; ++i)</span> <span class='diff-add'> list.push(bnd(arr[i]));</span> <span class='diff-add'> }</span> <span class='diff-add'> function fireOrphanDelayed() {</span> <span class='diff-add'> var delayed = orphanDelayedCallbacks;</span> <span class='diff-add'> orphanDelayedCallbacks = null;</span> <span class='diff-add'> for (var i = 0; i < delayed.length; ++i) delayed[i]();</span> <span class='diff-add'> }</span> <span class='diff-add'> // The DOM events that CodeMirror handles can be overridden by</span> <span class='diff-add'> // registering a (non-DOM) handler on the editor for the event name,</span> <span class='diff-add'> // and preventDefault-ing the event in that handler.</span> <span class='diff-add'> function signalDOMEvent(cm, e, override) {</span> <span class='diff-add'> if (typeof e == "string")</span> <span class='diff-add'> e = {type: e, preventDefault: function() { this.defaultPrevented = true; }};</span> <span class='diff-add'> signal(cm, override || e.type, cm, e);</span> <span class='diff-add'> return e_defaultPrevented(e) || e.codemirrorIgnore;</span> <span class='diff-add'> }</span> <span class='diff-add'> function signalCursorActivity(cm) {</span> <span class='diff-add'> var arr = cm._handlers && cm._handlers.cursorActivity;</span> <span class='diff-add'> if (!arr) return;</span> <span class='diff-add'> var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);</span> <span class='diff-add'> for (var i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1)</span> <span class='diff-add'> set.push(arr[i]);</span> <span class='diff-add'> }</span> <span class='diff-add'> function hasHandler(emitter, type) {</span> <span class='diff-add'> var arr = emitter._handlers && emitter._handlers[type];</span> <span class='diff-add'> return arr && arr.length > 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Add on and off methods to a constructor's prototype, to make</span> <span class='diff-add'> // registering events on such objects more convenient.</span> <span class='diff-add'> function eventMixin(ctor) {</span> <span class='diff-add'> ctor.prototype.on = function(type, f) {on(this, type, f);};</span> <span class='diff-add'> ctor.prototype.off = function(type, f) {off(this, type, f);};</span> <span class='diff-add'> }</span> <span class='diff-add'> // MISC UTILITIES</span> <span class='diff-add'> // Number of pixels added to scroller and sizer to hide scrollbar</span> <span class='diff-add'> var scrollerGap = 30;</span> <span class='diff-add'> // Returned or thrown by various protocols to signal 'I'm not</span> <span class='diff-add'> // handling this'.</span> <span class='diff-add'> var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}};</span> <span class='diff-add'> // Reused option objects for setSelection & friends</span> <span class='diff-add'> var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"};</span> <span class='diff-add'> function Delayed() {this.id = null;}</span> <span class='diff-add'> Delayed.prototype.set = function(ms, f) {</span> <span class='diff-add'> clearTimeout(this.id);</span> <span class='diff-add'> this.id = setTimeout(f, ms);</span> <span class='diff-add'> };</span> <span class='diff-add'> // Counts the column offset in a string, taking tabs into account.</span> <span class='diff-add'> // Used mostly to find indentation.</span> <span class='diff-add'> var countColumn = CodeMirror.countColumn = function(string, end, tabSize, startIndex, startValue) {</span> <span class='diff-add'> if (end == null) {</span> <span class='diff-add'> end = string.search(/[^\s\u00a0]/);</span> <span class='diff-add'> if (end == -1) end = string.length;</span> <span class='diff-add'> }</span> <span class='diff-add'> for (var i = startIndex || 0, n = startValue || 0;;) {</span> <span class='diff-add'> var nextTab = string.indexOf("\t", i);</span> <span class='diff-add'> if (nextTab < 0 || nextTab >= end)</span> <span class='diff-add'> return n + (end - i);</span> <span class='diff-add'> n += nextTab - i;</span> <span class='diff-add'> n += tabSize - (n % tabSize);</span> <span class='diff-add'> i = nextTab + 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // The inverse of countColumn -- find the offset that corresponds to</span> <span class='diff-add'> // a particular column.</span> <span class='diff-add'> function findColumn(string, goal, tabSize) {</span> <span class='diff-add'> for (var pos = 0, col = 0;;) {</span> <span class='diff-add'> var nextTab = string.indexOf("\t", pos);</span> <span class='diff-add'> if (nextTab == -1) nextTab = string.length;</span> <span class='diff-add'> var skipped = nextTab - pos;</span> <span class='diff-add'> if (nextTab == string.length || col + skipped >= goal)</span> <span class='diff-add'> return pos + Math.min(skipped, goal - col);</span> <span class='diff-add'> col += nextTab - pos;</span> <span class='diff-add'> col += tabSize - (col % tabSize);</span> <span class='diff-add'> pos = nextTab + 1;</span> <span class='diff-add'> if (col >= goal) return pos;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> var spaceStrs = [""];</span> <span class='diff-add'> function spaceStr(n) {</span> <span class='diff-add'> while (spaceStrs.length <= n)</span> <span class='diff-add'> spaceStrs.push(lst(spaceStrs) + " ");</span> <span class='diff-add'> return spaceStrs[n];</span> <span class='diff-add'> }</span> <span class='diff-add'> function lst(arr) { return arr[arr.length-1]; }</span> <span class='diff-add'> var selectInput = function(node) { node.select(); };</span> <span class='diff-add'> if (ios) // Mobile Safari apparently has a bug where select() is broken.</span> <span class='diff-add'> selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; };</span> <span class='diff-add'> else if (ie) // Suppress mysterious IE10 errors</span> <span class='diff-add'> selectInput = function(node) { try { node.select(); } catch(_e) {} };</span> <span class='diff-add'> function indexOf(array, elt) {</span> <span class='diff-add'> for (var i = 0; i < array.length; ++i)</span> <span class='diff-add'> if (array[i] == elt) return i;</span> <span class='diff-add'> return -1;</span> <span class='diff-add'> }</span> <span class='diff-add'> if ([].indexOf) indexOf = function(array, elt) { return array.indexOf(elt); };</span> <span class='diff-add'> function map(array, f) {</span> <span class='diff-add'> var out = [];</span> <span class='diff-add'> for (var i = 0; i < array.length; i++) out[i] = f(array[i], i);</span> <span class='diff-add'> return out;</span> <span class='diff-add'> }</span> <span class='diff-add'> if ([].map) map = function(array, f) { return array.map(f); };</span> <span class='diff-add'> function createObj(base, props) {</span> <span class='diff-add'> var inst;</span> <span class='diff-add'> if (Object.create) {</span> <span class='diff-add'> inst = Object.create(base);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var ctor = function() {};</span> <span class='diff-add'> ctor.prototype = base;</span> <span class='diff-add'> inst = new ctor();</span> <span class='diff-add'> }</span> <span class='diff-add'> if (props) copyObj(props, inst);</span> <span class='diff-add'> return inst;</span> <span class='diff-add'> };</span> <span class='diff-add'> function copyObj(obj, target, overwrite) {</span> <span class='diff-add'> if (!target) target = {};</span> <span class='diff-add'> for (var prop in obj)</span> <span class='diff-add'> if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))</span> <span class='diff-add'> target[prop] = obj[prop];</span> <span class='diff-add'> return target;</span> <span class='diff-add'> }</span> <span class='diff-add'> function bind(f) {</span> <span class='diff-add'> var args = Array.prototype.slice.call(arguments, 1);</span> <span class='diff-add'> return function(){return f.apply(null, args);};</span> <span class='diff-add'> }</span> <span class='diff-add'> var nonASCIISingleCaseWordChar = /[\u00df\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;</span> <span class='diff-add'> var isWordCharBasic = CodeMirror.isWordChar = function(ch) {</span> <span class='diff-add'> return /\w/.test(ch) || ch > "\x80" &&</span> <span class='diff-add'> (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));</span> <span class='diff-add'> };</span> <span class='diff-add'> function isWordChar(ch, helper) {</span> <span class='diff-add'> if (!helper) return isWordCharBasic(ch);</span> <span class='diff-add'> if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) return true;</span> <span class='diff-add'> return helper.test(ch);</span> <span class='diff-add'> }</span> <span class='diff-add'> function isEmpty(obj) {</span> <span class='diff-add'> for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false;</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Extending unicode characters. A series of a non-extending char +</span> <span class='diff-add'> // any number of extending chars is treated as a single unit as far</span> <span class='diff-add'> // as editing and measuring is concerned. This is not fully correct,</span> <span class='diff-add'> // since some scripts/fonts/browsers also treat other configurations</span> <span class='diff-add'> // of code points as a group.</span> <span class='diff-add'> var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;</span> <span class='diff-add'> function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); }</span> <span class='diff-add'> // DOM UTILITIES</span> <span class='diff-add'> function elt(tag, content, className, style) {</span> <span class='diff-add'> var e = document.createElement(tag);</span> <span class='diff-add'> if (className) e.className = className;</span> <span class='diff-add'> if (style) e.style.cssText = style;</span> <span class='diff-add'> if (typeof content == "string") e.appendChild(document.createTextNode(content));</span> <span class='diff-add'> else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);</span> <span class='diff-add'> return e;</span> <span class='diff-add'> }</span> <span class='diff-add'> var range;</span> <span class='diff-add'> if (document.createRange) range = function(node, start, end) {</span> <span class='diff-add'> var r = document.createRange();</span> <span class='diff-add'> r.setEnd(node, end);</span> <span class='diff-add'> r.setStart(node, start);</span> <span class='diff-add'> return r;</span> <span class='diff-add'> };</span> <span class='diff-add'> else range = function(node, start, end) {</span> <span class='diff-add'> var r = document.body.createTextRange();</span> <span class='diff-add'> try { r.moveToElementText(node.parentNode); }</span> <span class='diff-add'> catch(e) { return r; }</span> <span class='diff-add'> r.collapse(true);</span> <span class='diff-add'> r.moveEnd("character", end);</span> <span class='diff-add'> r.moveStart("character", start);</span> <span class='diff-add'> return r;</span> <span class='diff-add'> };</span> <span class='diff-add'> function removeChildren(e) {</span> <span class='diff-add'> for (var count = e.childNodes.length; count > 0; --count)</span> <span class='diff-add'> e.removeChild(e.firstChild);</span> <span class='diff-add'> return e;</span> <span class='diff-add'> }</span> <span class='diff-add'> function removeChildrenAndAdd(parent, e) {</span> <span class='diff-add'> return removeChildren(parent).appendChild(e);</span> <span class='diff-add'> }</span> <span class='diff-add'> function contains(parent, child) {</span> <span class='diff-add'> if (parent.contains)</span> <span class='diff-add'> return parent.contains(child);</span> <span class='diff-add'> while (child = child.parentNode)</span> <span class='diff-add'> if (child == parent) return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> function activeElt() { return document.activeElement; }</span> <span class='diff-add'> // Older versions of IE throws unspecified error when touching</span> <span class='diff-add'> // document.activeElement in some cases (during loading, in iframe)</span> <span class='diff-add'> if (ie && ie_version < 11) activeElt = function() {</span> <span class='diff-add'> try { return document.activeElement; }</span> <span class='diff-add'> catch(e) { return document.body; }</span> <span class='diff-add'> };</span> <span class='diff-add'> function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); }</span> <span class='diff-add'> var rmClass = CodeMirror.rmClass = function(node, cls) {</span> <span class='diff-add'> var current = node.className;</span> <span class='diff-add'> var match = classTest(cls).exec(current);</span> <span class='diff-add'> if (match) {</span> <span class='diff-add'> var after = current.slice(match.index + match[0].length);</span> <span class='diff-add'> node.className = current.slice(0, match.index) + (after ? match[1] + after : "");</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var addClass = CodeMirror.addClass = function(node, cls) {</span> <span class='diff-add'> var current = node.className;</span> <span class='diff-add'> if (!classTest(cls).test(current)) node.className += (current ? " " : "") + cls;</span> <span class='diff-add'> };</span> <span class='diff-add'> function joinClasses(a, b) {</span> <span class='diff-add'> var as = a.split(" ");</span> <span class='diff-add'> for (var i = 0; i < as.length; i++)</span> <span class='diff-add'> if (as[i] && !classTest(as[i]).test(b)) b += " " + as[i];</span> <span class='diff-add'> return b;</span> <span class='diff-add'> }</span> <span class='diff-add'> // WINDOW-WIDE EVENTS</span> <span class='diff-add'> // These must be handled carefully, because naively registering a</span> <span class='diff-add'> // handler for each editor will cause the editors to never be</span> <span class='diff-add'> // garbage collected.</span> <span class='diff-add'> function forEachCodeMirror(f) {</span> <span class='diff-add'> if (!document.body.getElementsByClassName) return;</span> <span class='diff-add'> var byClass = document.body.getElementsByClassName("CodeMirror");</span> <span class='diff-add'> for (var i = 0; i < byClass.length; i++) {</span> <span class='diff-add'> var cm = byClass[i].CodeMirror;</span> <span class='diff-add'> if (cm) f(cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> var globalsRegistered = false;</span> <span class='diff-add'> function ensureGlobalHandlers() {</span> <span class='diff-add'> if (globalsRegistered) return;</span> <span class='diff-add'> registerGlobalHandlers();</span> <span class='diff-add'> globalsRegistered = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> function registerGlobalHandlers() {</span> <span class='diff-add'> // When the window resizes, we need to refresh active editors.</span> <span class='diff-add'> var resizeTimer;</span> <span class='diff-add'> on(window, "resize", function() {</span> <span class='diff-add'> if (resizeTimer == null) resizeTimer = setTimeout(function() {</span> <span class='diff-add'> resizeTimer = null;</span> <span class='diff-add'> forEachCodeMirror(onResize);</span> <span class='diff-add'> }, 100);</span> <span class='diff-add'> });</span> <span class='diff-add'> // When the window loses focus, we want to show the editor as blurred</span> <span class='diff-add'> on(window, "blur", function() {</span> <span class='diff-add'> forEachCodeMirror(onBlur);</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> // FEATURE DETECTION</span> <span class='diff-add'> // Detect drag-and-drop</span> <span class='diff-add'> var dragAndDrop = function() {</span> <span class='diff-add'> // There is *some* kind of drag-and-drop support in IE6-8, but I</span> <span class='diff-add'> // couldn't get it to work yet.</span> <span class='diff-add'> if (ie && ie_version < 9) return false;</span> <span class='diff-add'> var div = elt('div');</span> <span class='diff-add'> return "draggable" in div || "dragDrop" in div;</span> <span class='diff-add'> }();</span> <span class='diff-add'> var zwspSupported;</span> <span class='diff-add'> function zeroWidthElement(measure) {</span> <span class='diff-add'> if (zwspSupported == null) {</span> <span class='diff-add'> var test = elt("span", "\u200b");</span> <span class='diff-add'> removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")]));</span> <span class='diff-add'> if (measure.firstChild.offsetHeight != 0)</span> <span class='diff-add'> zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (zwspSupported) return elt("span", "\u200b");</span> <span class='diff-add'> else return elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px");</span> <span class='diff-add'> }</span> <span class='diff-add'> // Feature-detect IE's crummy client rect reporting for bidi text</span> <span class='diff-add'> var badBidiRects;</span> <span class='diff-add'> function hasBadBidiRects(measure) {</span> <span class='diff-add'> if (badBidiRects != null) return badBidiRects;</span> <span class='diff-add'> var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA"));</span> <span class='diff-add'> var r0 = range(txt, 0, 1).getBoundingClientRect();</span> <span class='diff-add'> if (!r0 || r0.left == r0.right) return false; // Safari returns null in some cases (#2780)</span> <span class='diff-add'> var r1 = range(txt, 1, 2).getBoundingClientRect();</span> <span class='diff-add'> return badBidiRects = (r1.right - r0.right < 3);</span> <span class='diff-add'> }</span> <span class='diff-add'> // See if "".split is the broken IE version, if so, provide an</span> <span class='diff-add'> // alternative way to split lines.</span> <span class='diff-add'> var splitLines = CodeMirror.splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) {</span> <span class='diff-add'> var pos = 0, result = [], l = string.length;</span> <span class='diff-add'> while (pos <= l) {</span> <span class='diff-add'> var nl = string.indexOf("\n", pos);</span> <span class='diff-add'> if (nl == -1) nl = string.length;</span> <span class='diff-add'> var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl);</span> <span class='diff-add'> var rt = line.indexOf("\r");</span> <span class='diff-add'> if (rt != -1) {</span> <span class='diff-add'> result.push(line.slice(0, rt));</span> <span class='diff-add'> pos += rt + 1;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> result.push(line);</span> <span class='diff-add'> pos = nl + 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return result;</span> <span class='diff-add'> } : function(string){return string.split(/\r\n?|\n/);};</span> <span class='diff-add'> var hasSelection = window.getSelection ? function(te) {</span> <span class='diff-add'> try { return te.selectionStart != te.selectionEnd; }</span> <span class='diff-add'> catch(e) { return false; }</span> <span class='diff-add'> } : function(te) {</span> <span class='diff-add'> try {var range = te.ownerDocument.selection.createRange();}</span> <span class='diff-add'> catch(e) {}</span> <span class='diff-add'> if (!range || range.parentElement() != te) return false;</span> <span class='diff-add'> return range.compareEndPoints("StartToEnd", range) != 0;</span> <span class='diff-add'> };</span> <span class='diff-add'> var hasCopyEvent = (function() {</span> <span class='diff-add'> var e = elt("div");</span> <span class='diff-add'> if ("oncopy" in e) return true;</span> <span class='diff-add'> e.setAttribute("oncopy", "return;");</span> <span class='diff-add'> return typeof e.oncopy == "function";</span> <span class='diff-add'> })();</span> <span class='diff-add'> var badZoomedRects = null;</span> <span class='diff-add'> function hasBadZoomedRects(measure) {</span> <span class='diff-add'> if (badZoomedRects != null) return badZoomedRects;</span> <span class='diff-add'> var node = removeChildrenAndAdd(measure, elt("span", "x"));</span> <span class='diff-add'> var normal = node.getBoundingClientRect();</span> <span class='diff-add'> var fromRange = range(node, 0, 1).getBoundingClientRect();</span> <span class='diff-add'> return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> // KEY NAMES</span> <span class='diff-add'> var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",</span> <span class='diff-add'> 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",</span> <span class='diff-add'> 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",</span> <span class='diff-add'> 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", 107: "=", 109: "-", 127: "Delete",</span> <span class='diff-add'> 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",</span> <span class='diff-add'> 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete",</span> <span class='diff-add'> 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"};</span> <span class='diff-add'> CodeMirror.keyNames = keyNames;</span> <span class='diff-add'> (function() {</span> <span class='diff-add'> // Number keys</span> <span class='diff-add'> for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i);</span> <span class='diff-add'> // Alphabetic keys</span> <span class='diff-add'> for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);</span> <span class='diff-add'> // Function keys</span> <span class='diff-add'> for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i;</span> <span class='diff-add'> })();</span> <span class='diff-add'> // BIDI HELPERS</span> <span class='diff-add'> function iterateBidiSections(order, from, to, f) {</span> <span class='diff-add'> if (!order) return f(from, to, "ltr");</span> <span class='diff-add'> var found = false;</span> <span class='diff-add'> for (var i = 0; i < order.length; ++i) {</span> <span class='diff-add'> var part = order[i];</span> <span class='diff-add'> if (part.from < to && part.to > from || from == to && part.to == from) {</span> <span class='diff-add'> f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr");</span> <span class='diff-add'> found = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!found) f(from, to, "ltr");</span> <span class='diff-add'> }</span> <span class='diff-add'> function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }</span> <span class='diff-add'> function bidiRight(part) { return part.level % 2 ? part.from : part.to; }</span> <span class='diff-add'> function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; }</span> <span class='diff-add'> function lineRight(line) {</span> <span class='diff-add'> var order = getOrder(line);</span> <span class='diff-add'> if (!order) return line.text.length;</span> <span class='diff-add'> return bidiRight(lst(order));</span> <span class='diff-add'> }</span> <span class='diff-add'> function lineStart(cm, lineN) {</span> <span class='diff-add'> var line = getLine(cm.doc, lineN);</span> <span class='diff-add'> var visual = visualLine(line);</span> <span class='diff-add'> if (visual != line) lineN = lineNo(visual);</span> <span class='diff-add'> var order = getOrder(visual);</span> <span class='diff-add'> var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual);</span> <span class='diff-add'> return Pos(lineN, ch);</span> <span class='diff-add'> }</span> <span class='diff-add'> function lineEnd(cm, lineN) {</span> <span class='diff-add'> var merged, line = getLine(cm.doc, lineN);</span> <span class='diff-add'> while (merged = collapsedSpanAtEnd(line)) {</span> <span class='diff-add'> line = merged.find(1, true).line;</span> <span class='diff-add'> lineN = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> var order = getOrder(line);</span> <span class='diff-add'> var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line);</span> <span class='diff-add'> return Pos(lineN == null ? lineNo(line) : lineN, ch);</span> <span class='diff-add'> }</span> <span class='diff-add'> function lineStartSmart(cm, pos) {</span> <span class='diff-add'> var start = lineStart(cm, pos.line);</span> <span class='diff-add'> var line = getLine(cm.doc, start.line);</span> <span class='diff-add'> var order = getOrder(line);</span> <span class='diff-add'> if (!order || order[0].level == 0) {</span> <span class='diff-add'> var firstNonWS = Math.max(0, line.text.search(/\S/));</span> <span class='diff-add'> var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;</span> <span class='diff-add'> return Pos(start.line, inWS ? 0 : firstNonWS);</span> <span class='diff-add'> }</span> <span class='diff-add'> return start;</span> <span class='diff-add'> }</span> <span class='diff-add'> function compareBidiLevel(order, a, b) {</span> <span class='diff-add'> var linedir = order[0].level;</span> <span class='diff-add'> if (a == linedir) return true;</span> <span class='diff-add'> if (b == linedir) return false;</span> <span class='diff-add'> return a < b;</span> <span class='diff-add'> }</span> <span class='diff-add'> var bidiOther;</span> <span class='diff-add'> function getBidiPartAt(order, pos) {</span> <span class='diff-add'> bidiOther = null;</span> <span class='diff-add'> for (var i = 0, found; i < order.length; ++i) {</span> <span class='diff-add'> var cur = order[i];</span> <span class='diff-add'> if (cur.from < pos && cur.to > pos) return i;</span> <span class='diff-add'> if ((cur.from == pos || cur.to == pos)) {</span> <span class='diff-add'> if (found == null) {</span> <span class='diff-add'> found = i;</span> <span class='diff-add'> } else if (compareBidiLevel(order, cur.level, order[found].level)) {</span> <span class='diff-add'> if (cur.from != cur.to) bidiOther = found;</span> <span class='diff-add'> return i;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> if (cur.from != cur.to) bidiOther = i;</span> <span class='diff-add'> return found;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return found;</span> <span class='diff-add'> }</span> <span class='diff-add'> function moveInLine(line, pos, dir, byUnit) {</span> <span class='diff-add'> if (!byUnit) return pos + dir;</span> <span class='diff-add'> do pos += dir;</span> <span class='diff-add'> while (pos > 0 && isExtendingChar(line.text.charAt(pos)));</span> <span class='diff-add'> return pos;</span> <span class='diff-add'> }</span> <span class='diff-add'> // This is needed in order to move 'visually' through bi-directional</span> <span class='diff-add'> // text -- i.e., pressing left should make the cursor go left, even</span> <span class='diff-add'> // when in RTL text. The tricky part is the 'jumps', where RTL and</span> <span class='diff-add'> // LTR text touch each other. This often requires the cursor offset</span> <span class='diff-add'> // to move more than one unit, in order to visually move one unit.</span> <span class='diff-add'> function moveVisually(line, start, dir, byUnit) {</span> <span class='diff-add'> var bidi = getOrder(line);</span> <span class='diff-add'> if (!bidi) return moveLogically(line, start, dir, byUnit);</span> <span class='diff-add'> var pos = getBidiPartAt(bidi, start), part = bidi[pos];</span> <span class='diff-add'> var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit);</span> <span class='diff-add'> for (;;) {</span> <span class='diff-add'> if (target > part.from && target < part.to) return target;</span> <span class='diff-add'> if (target == part.from || target == part.to) {</span> <span class='diff-add'> if (getBidiPartAt(bidi, target) == pos) return target;</span> <span class='diff-add'> part = bidi[pos += dir];</span> <span class='diff-add'> return (dir > 0) == part.level % 2 ? part.to : part.from;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> part = bidi[pos += dir];</span> <span class='diff-add'> if (!part) return null;</span> <span class='diff-add'> if ((dir > 0) == part.level % 2)</span> <span class='diff-add'> target = moveInLine(line, part.to, -1, byUnit);</span> <span class='diff-add'> else</span> <span class='diff-add'> target = moveInLine(line, part.from, 1, byUnit);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function moveLogically(line, start, dir, byUnit) {</span> <span class='diff-add'> var target = start + dir;</span> <span class='diff-add'> if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir;</span> <span class='diff-add'> return target < 0 || target > line.text.length ? null : target;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Bidirectional ordering algorithm</span> <span class='diff-add'> // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm</span> <span class='diff-add'> // that this (partially) implements.</span> <span class='diff-add'> // One-char codes used for character types:</span> <span class='diff-add'> // L (L): Left-to-Right</span> <span class='diff-add'> // R (R): Right-to-Left</span> <span class='diff-add'> // r (AL): Right-to-Left Arabic</span> <span class='diff-add'> // 1 (EN): European Number</span> <span class='diff-add'> // + (ES): European Number Separator</span> <span class='diff-add'> // % (ET): European Number Terminator</span> <span class='diff-add'> // n (AN): Arabic Number</span> <span class='diff-add'> // , (CS): Common Number Separator</span> <span class='diff-add'> // m (NSM): Non-Spacing Mark</span> <span class='diff-add'> // b (BN): Boundary Neutral</span> <span class='diff-add'> // s (B): Paragraph Separator</span> <span class='diff-add'> // t (S): Segment Separator</span> <span class='diff-add'> // w (WS): Whitespace</span> <span class='diff-add'> // N (ON): Other Neutrals</span> <span class='diff-add'> // Returns null if characters are ordered as they appear</span> <span class='diff-add'> // (left-to-right), or an array of sections ({from, to, level}</span> <span class='diff-add'> // objects) in the order in which they occur visually.</span> <span class='diff-add'> var bidiOrdering = (function() {</span> <span class='diff-add'> // Character types for codepoints 0 to 0xff</span> <span class='diff-add'> var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN";</span> <span class='diff-add'> // Character types for codepoints 0x600 to 0x6ff</span> <span class='diff-add'> var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm";</span> <span class='diff-add'> function charType(code) {</span> <span class='diff-add'> if (code <= 0xf7) return lowTypes.charAt(code);</span> <span class='diff-add'> else if (0x590 <= code && code <= 0x5f4) return "R";</span> <span class='diff-add'> else if (0x600 <= code && code <= 0x6ed) return arabicTypes.charAt(code - 0x600);</span> <span class='diff-add'> else if (0x6ee <= code && code <= 0x8ac) return "r";</span> <span class='diff-add'> else if (0x2000 <= code && code <= 0x200b) return "w";</span> <span class='diff-add'> else if (code == 0x200c) return "b";</span> <span class='diff-add'> else return "L";</span> <span class='diff-add'> }</span> <span class='diff-add'> var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;</span> <span class='diff-add'> var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;</span> <span class='diff-add'> // Browsers seem to always treat the boundaries of block elements as being L.</span> <span class='diff-add'> var outerType = "L";</span> <span class='diff-add'> function BidiSpan(level, from, to) {</span> <span class='diff-add'> this.level = level;</span> <span class='diff-add'> this.from = from; this.to = to;</span> <span class='diff-add'> }</span> <span class='diff-add'> return function(str) {</span> <span class='diff-add'> if (!bidiRE.test(str)) return false;</span> <span class='diff-add'> var len = str.length, types = [];</span> <span class='diff-add'> for (var i = 0, type; i < len; ++i)</span> <span class='diff-add'> types.push(type = charType(str.charCodeAt(i)));</span> <span class='diff-add'> // W1. Examine each non-spacing mark (NSM) in the level run, and</span> <span class='diff-add'> // change the type of the NSM to the type of the previous</span> <span class='diff-add'> // character. If the NSM is at the start of the level run, it will</span> <span class='diff-add'> // get the type of sor.</span> <span class='diff-add'> for (var i = 0, prev = outerType; i < len; ++i) {</span> <span class='diff-add'> var type = types[i];</span> <span class='diff-add'> if (type == "m") types[i] = prev;</span> <span class='diff-add'> else prev = type;</span> <span class='diff-add'> }</span> <span class='diff-add'> // W2. Search backwards from each instance of a European number</span> <span class='diff-add'> // until the first strong type (R, L, AL, or sor) is found. If an</span> <span class='diff-add'> // AL is found, change the type of the European number to Arabic</span> <span class='diff-add'> // number.</span> <span class='diff-add'> // W3. Change all ALs to R.</span> <span class='diff-add'> for (var i = 0, cur = outerType; i < len; ++i) {</span> <span class='diff-add'> var type = types[i];</span> <span class='diff-add'> if (type == "1" && cur == "r") types[i] = "n";</span> <span class='diff-add'> else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; }</span> <span class='diff-add'> }</span> <span class='diff-add'> // W4. A single European separator between two European numbers</span> <span class='diff-add'> // changes to a European number. A single common separator between</span> <span class='diff-add'> // two numbers of the same type changes to that type.</span> <span class='diff-add'> for (var i = 1, prev = types[0]; i < len - 1; ++i) {</span> <span class='diff-add'> var type = types[i];</span> <span class='diff-add'> if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1";</span> <span class='diff-add'> else if (type == "," && prev == types[i+1] &&</span> <span class='diff-add'> (prev == "1" || prev == "n")) types[i] = prev;</span> <span class='diff-add'> prev = type;</span> <span class='diff-add'> }</span> <span class='diff-add'> // W5. A sequence of European terminators adjacent to European</span> <span class='diff-add'> // numbers changes to all European numbers.</span> <span class='diff-add'> // W6. Otherwise, separators and terminators change to Other</span> <span class='diff-add'> // Neutral.</span> <span class='diff-add'> for (var i = 0; i < len; ++i) {</span> <span class='diff-add'> var type = types[i];</span> <span class='diff-add'> if (type == ",") types[i] = "N";</span> <span class='diff-add'> else if (type == "%") {</span> <span class='diff-add'> for (var end = i + 1; end < len && types[end] == "%"; ++end) {}</span> <span class='diff-add'> var replace = (i && types[i-1] == "!") || (end < len && types[end] == "1") ? "1" : "N";</span> <span class='diff-add'> for (var j = i; j < end; ++j) types[j] = replace;</span> <span class='diff-add'> i = end - 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // W7. Search backwards from each instance of a European number</span> <span class='diff-add'> // until the first strong type (R, L, or sor) is found. If an L is</span> <span class='diff-add'> // found, then change the type of the European number to L.</span> <span class='diff-add'> for (var i = 0, cur = outerType; i < len; ++i) {</span> <span class='diff-add'> var type = types[i];</span> <span class='diff-add'> if (cur == "L" && type == "1") types[i] = "L";</span> <span class='diff-add'> else if (isStrong.test(type)) cur = type;</span> <span class='diff-add'> }</span> <span class='diff-add'> // N1. A sequence of neutrals takes the direction of the</span> <span class='diff-add'> // surrounding strong text if the text on both sides has the same</span> <span class='diff-add'> // direction. European and Arabic numbers act as if they were R in</span> <span class='diff-add'> // terms of their influence on neutrals. Start-of-level-run (sor)</span> <span class='diff-add'> // and end-of-level-run (eor) are used at level run boundaries.</span> <span class='diff-add'> // N2. Any remaining neutrals take the embedding direction.</span> <span class='diff-add'> for (var i = 0; i < len; ++i) {</span> <span class='diff-add'> if (isNeutral.test(types[i])) {</span> <span class='diff-add'> for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}</span> <span class='diff-add'> var before = (i ? types[i-1] : outerType) == "L";</span> <span class='diff-add'> var after = (end < len ? types[end] : outerType) == "L";</span> <span class='diff-add'> var replace = before || after ? "L" : "R";</span> <span class='diff-add'> for (var j = i; j < end; ++j) types[j] = replace;</span> <span class='diff-add'> i = end - 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Here we depart from the documented algorithm, in order to avoid</span> <span class='diff-add'> // building up an actual levels array. Since there are only three</span> <span class='diff-add'> // levels (0, 1, 2) in an implementation that doesn't take</span> <span class='diff-add'> // explicit embedding into account, we can build up the order on</span> <span class='diff-add'> // the fly, without following the level-based algorithm.</span> <span class='diff-add'> var order = [], m;</span> <span class='diff-add'> for (var i = 0; i < len;) {</span> <span class='diff-add'> if (countsAsLeft.test(types[i])) {</span> <span class='diff-add'> var start = i;</span> <span class='diff-add'> for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}</span> <span class='diff-add'> order.push(new BidiSpan(0, start, i));</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var pos = i, at = order.length;</span> <span class='diff-add'> for (++i; i < len && types[i] != "L"; ++i) {}</span> <span class='diff-add'> for (var j = pos; j < i;) {</span> <span class='diff-add'> if (countsAsNum.test(types[j])) {</span> <span class='diff-add'> if (pos < j) order.splice(at, 0, new BidiSpan(1, pos, j));</span> <span class='diff-add'> var nstart = j;</span> <span class='diff-add'> for (++j; j < i && countsAsNum.test(types[j]); ++j) {}</span> <span class='diff-add'> order.splice(at, 0, new BidiSpan(2, nstart, j));</span> <span class='diff-add'> pos = j;</span> <span class='diff-add'> } else ++j;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (order[0].level == 1 && (m = str.match(/^\s+/))) {</span> <span class='diff-add'> order[0].from = m[0].length;</span> <span class='diff-add'> order.unshift(new BidiSpan(0, 0, m[0].length));</span> <span class='diff-add'> }</span> <span class='diff-add'> if (lst(order).level == 1 && (m = str.match(/\s+$/))) {</span> <span class='diff-add'> lst(order).to -= m[0].length;</span> <span class='diff-add'> order.push(new BidiSpan(0, len - m[0].length, len));</span> <span class='diff-add'> }</span> <span class='diff-add'> if (order[0].level != lst(order).level)</span> <span class='diff-add'> order.push(new BidiSpan(order[0].level, len, len));</span> <span class='diff-add'> return order;</span> <span class='diff-add'> };</span> <span class='diff-add'> })();</span> <span class='diff-add'> // THE END</span> <span class='diff-add'> CodeMirror.version = "4.11.0";</span> <span class='diff-add'> return CodeMirror;</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/comm.js b/ipynb/Array-feature-overlap-05_files/comm.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..cffd66f</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/comm.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'>], function(IPython, $, utils) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> //-----------------------------------------------------------------------</span> <span class='diff-add'> // CommManager class</span> <span class='diff-add'> //-----------------------------------------------------------------------</span> <span class='diff-add'> </span> <span class='diff-add'> var CommManager = function (kernel) {</span> <span class='diff-add'> this.comms = {};</span> <span class='diff-add'> this.targets = {};</span> <span class='diff-add'> if (kernel !== undefined) {</span> <span class='diff-add'> this.init_kernel(kernel);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> CommManager.prototype.init_kernel = function (kernel) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * connect the kernel, and register message handlers</span> <span class='diff-add'> */</span> <span class='diff-add'> this.kernel = kernel;</span> <span class='diff-add'> var msg_types = ['comm_open', 'comm_msg', 'comm_close'];</span> <span class='diff-add'> for (var i = 0; i < msg_types.length; i++) {</span> <span class='diff-add'> var msg_type = msg_types[i];</span> <span class='diff-add'> kernel.register_iopub_handler(msg_type, $.proxy(this[msg_type], this));</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> CommManager.prototype.new_comm = function (target_name, data, callbacks, metadata) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Create a new Comm, register it, and open its Kernel-side counterpart</span> <span class='diff-add'> * Mimics the auto-registration in `Comm.__init__` in the IPython Comm</span> <span class='diff-add'> */</span> <span class='diff-add'> var comm = new Comm(target_name);</span> <span class='diff-add'> this.register_comm(comm);</span> <span class='diff-add'> comm.open(data, callbacks, metadata);</span> <span class='diff-add'> return comm;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> CommManager.prototype.register_target = function (target_name, f) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Register a target function for a given target name</span> <span class='diff-add'> */</span> <span class='diff-add'> this.targets[target_name] = f;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> CommManager.prototype.unregister_target = function (target_name, f) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Unregister a target function for a given target name</span> <span class='diff-add'> */</span> <span class='diff-add'> delete this.targets[target_name];</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> CommManager.prototype.register_comm = function (comm) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Register a comm in the mapping</span> <span class='diff-add'> */</span> <span class='diff-add'> this.comms[comm.comm_id] = Promise.resolve(comm);</span> <span class='diff-add'> comm.kernel = this.kernel;</span> <span class='diff-add'> return comm.comm_id;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> CommManager.prototype.unregister_comm = function (comm) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Remove a comm from the mapping</span> <span class='diff-add'> */</span> <span class='diff-add'> delete this.comms[comm.comm_id];</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> // comm message handlers</span> <span class='diff-add'> </span> <span class='diff-add'> CommManager.prototype.comm_open = function (msg) {</span> <span class='diff-add'> var content = msg.content;</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var comm_id = content.comm_id;</span> <span class='diff-add'> this.comms[comm_id] = utils.load_class(content.target_name, content.target_module, </span> <span class='diff-add'> this.targets).then(function(target) {</span> <span class='diff-add'> var comm = new Comm(content.target_name, comm_id);</span> <span class='diff-add'> comm.kernel = that.kernel;</span> <span class='diff-add'> try {</span> <span class='diff-add'> var response = target(comm, msg);</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> comm.close();</span> <span class='diff-add'> that.unregister_comm(comm);</span> <span class='diff-add'> var wrapped_error = new utils.WrappedError("Exception opening new comm", e);</span> <span class='diff-add'> console.error(wrapped_error);</span> <span class='diff-add'> return Promise.reject(wrapped_error);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Regardless of the target return value, we need to</span> <span class='diff-add'> // then return the comm</span> <span class='diff-add'> return Promise.resolve(response).then(function() {return comm;});</span> <span class='diff-add'> }, utils.reject('Could not open comm', true));</span> <span class='diff-add'> return this.comms[comm_id];</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> CommManager.prototype.comm_close = function(msg) {</span> <span class='diff-add'> var content = msg.content;</span> <span class='diff-add'> if (this.comms[content.comm_id] === undefined) {</span> <span class='diff-add'> console.error('Comm promise not found for comm id ' + content.comm_id);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.comms[content.comm_id] = this.comms[content.comm_id].then(function(comm) {</span> <span class='diff-add'> that.unregister_comm(comm);</span> <span class='diff-add'> try {</span> <span class='diff-add'> comm.handle_close(msg);</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> console.log("Exception closing comm: ", e, e.stack, msg);</span> <span class='diff-add'> }</span> <span class='diff-add'> // don't return a comm, so that further .then() functions</span> <span class='diff-add'> // get an undefined comm input</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> CommManager.prototype.comm_msg = function(msg) {</span> <span class='diff-add'> var content = msg.content;</span> <span class='diff-add'> if (this.comms[content.comm_id] === undefined) {</span> <span class='diff-add'> console.error('Comm promise not found for comm id ' + content.comm_id);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.comms[content.comm_id] = this.comms[content.comm_id].then(function(comm) {</span> <span class='diff-add'> try {</span> <span class='diff-add'> comm.handle_msg(msg);</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> console.log("Exception handling comm msg: ", e, e.stack, msg);</span> <span class='diff-add'> }</span> <span class='diff-add'> return comm;</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> //-----------------------------------------------------------------------</span> <span class='diff-add'> // Comm base class</span> <span class='diff-add'> //-----------------------------------------------------------------------</span> <span class='diff-add'> </span> <span class='diff-add'> var Comm = function (target_name, comm_id) {</span> <span class='diff-add'> this.target_name = target_name;</span> <span class='diff-add'> this.comm_id = comm_id || utils.uuid();</span> <span class='diff-add'> this._msg_callback = this._close_callback = null;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> // methods for sending messages</span> <span class='diff-add'> Comm.prototype.open = function (data, callbacks, metadata) {</span> <span class='diff-add'> var content = {</span> <span class='diff-add'> comm_id : this.comm_id,</span> <span class='diff-add'> target_name : this.target_name,</span> <span class='diff-add'> data : data || {},</span> <span class='diff-add'> };</span> <span class='diff-add'> return this.kernel.send_shell_message("comm_open", content, callbacks, metadata);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> Comm.prototype.send = function (data, callbacks, metadata, buffers) {</span> <span class='diff-add'> var content = {</span> <span class='diff-add'> comm_id : this.comm_id,</span> <span class='diff-add'> data : data || {},</span> <span class='diff-add'> };</span> <span class='diff-add'> return this.kernel.send_shell_message("comm_msg", content, callbacks, metadata, buffers);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> Comm.prototype.close = function (data, callbacks, metadata) {</span> <span class='diff-add'> var content = {</span> <span class='diff-add'> comm_id : this.comm_id,</span> <span class='diff-add'> data : data || {},</span> <span class='diff-add'> };</span> <span class='diff-add'> return this.kernel.send_shell_message("comm_close", content, callbacks, metadata);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> // methods for registering callbacks for incoming messages</span> <span class='diff-add'> Comm.prototype._register_callback = function (key, callback) {</span> <span class='diff-add'> this['_' + key + '_callback'] = callback;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> Comm.prototype.on_msg = function (callback) {</span> <span class='diff-add'> this._register_callback('msg', callback);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> Comm.prototype.on_close = function (callback) {</span> <span class='diff-add'> this._register_callback('close', callback);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> // methods for handling incoming messages</span> <span class='diff-add'> </span> <span class='diff-add'> Comm.prototype._callback = function (key, msg) {</span> <span class='diff-add'> var callback = this['_' + key + '_callback'];</span> <span class='diff-add'> if (callback) {</span> <span class='diff-add'> try {</span> <span class='diff-add'> callback(msg);</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> console.log("Exception in Comm callback", e, e.stack, msg);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> Comm.prototype.handle_msg = function (msg) {</span> <span class='diff-add'> this._callback('msg', msg);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> Comm.prototype.handle_close = function (msg) {</span> <span class='diff-add'> this._callback('close', msg);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> // For backwards compatability.</span> <span class='diff-add'> IPython.CommManager = CommManager;</span> <span class='diff-add'> IPython.Comm = Comm;</span> <span class='diff-add'> return {</span> <span class='diff-add'> 'CommManager': CommManager,</span> <span class='diff-add'> 'Comm': Comm</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/comment.js b/ipynb/Array-feature-overlap-05_files/comment.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..2dd114d</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/comment.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span> <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span> <span class='diff-add'>(function(mod) {</span> <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span> <span class='diff-add'> mod(require("../../lib/codemirror"));</span> <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span> <span class='diff-add'> define(["../../lib/codemirror"], mod);</span> <span class='diff-add'> else // Plain browser env</span> <span class='diff-add'> mod(CodeMirror);</span> <span class='diff-add'>})(function(CodeMirror) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var noOptions = {};</span> <span class='diff-add'> var nonWS = /[^\s\u00a0]/;</span> <span class='diff-add'> var Pos = CodeMirror.Pos;</span> <span class='diff-add'> function firstNonWS(str) {</span> <span class='diff-add'> var found = str.search(nonWS);</span> <span class='diff-add'> return found == -1 ? 0 : found;</span> <span class='diff-add'> }</span> <span class='diff-add'> CodeMirror.commands.toggleComment = function(cm) {</span> <span class='diff-add'> var minLine = Infinity, ranges = cm.listSelections(), mode = null;</span> <span class='diff-add'> for (var i = ranges.length - 1; i >= 0; i--) {</span> <span class='diff-add'> var from = ranges[i].from(), to = ranges[i].to();</span> <span class='diff-add'> if (from.line >= minLine) continue;</span> <span class='diff-add'> if (to.line >= minLine) to = Pos(minLine, 0);</span> <span class='diff-add'> minLine = from.line;</span> <span class='diff-add'> if (mode == null) {</span> <span class='diff-add'> if (cm.uncomment(from, to)) mode = "un";</span> <span class='diff-add'> else { cm.lineComment(from, to); mode = "line"; }</span> <span class='diff-add'> } else if (mode == "un") {</span> <span class='diff-add'> cm.uncomment(from, to);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> cm.lineComment(from, to);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeMirror.defineExtension("lineComment", function(from, to, options) {</span> <span class='diff-add'> if (!options) options = noOptions;</span> <span class='diff-add'> var self = this, mode = self.getModeAt(from);</span> <span class='diff-add'> var commentString = options.lineComment || mode.lineComment;</span> <span class='diff-add'> if (!commentString) {</span> <span class='diff-add'> if (options.blockCommentStart || mode.blockCommentStart) {</span> <span class='diff-add'> options.fullLines = true;</span> <span class='diff-add'> self.blockComment(from, to, options);</span> <span class='diff-add'> }</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var firstLine = self.getLine(from.line);</span> <span class='diff-add'> if (firstLine == null) return;</span> <span class='diff-add'> var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1);</span> <span class='diff-add'> var pad = options.padding == null ? " " : options.padding;</span> <span class='diff-add'> var blankLines = options.commentBlankLines || from.line == to.line;</span> <span class='diff-add'> self.operation(function() {</span> <span class='diff-add'> if (options.indent) {</span> <span class='diff-add'> var baseString = firstLine.slice(0, firstNonWS(firstLine));</span> <span class='diff-add'> for (var i = from.line; i < end; ++i) {</span> <span class='diff-add'> var line = self.getLine(i), cut = baseString.length;</span> <span class='diff-add'> if (!blankLines && !nonWS.test(line)) continue;</span> <span class='diff-add'> if (line.slice(0, cut) != baseString) cut = firstNonWS(line);</span> <span class='diff-add'> self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut));</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> for (var i = from.line; i < end; ++i) {</span> <span class='diff-add'> if (blankLines || nonWS.test(self.getLine(i)))</span> <span class='diff-add'> self.replaceRange(commentString + pad, Pos(i, 0));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> });</span> <span class='diff-add'> CodeMirror.defineExtension("blockComment", function(from, to, options) {</span> <span class='diff-add'> if (!options) options = noOptions;</span> <span class='diff-add'> var self = this, mode = self.getModeAt(from);</span> <span class='diff-add'> var startString = options.blockCommentStart || mode.blockCommentStart;</span> <span class='diff-add'> var endString = options.blockCommentEnd || mode.blockCommentEnd;</span> <span class='diff-add'> if (!startString || !endString) {</span> <span class='diff-add'> if ((options.lineComment || mode.lineComment) && options.fullLines != false)</span> <span class='diff-add'> self.lineComment(from, to, options);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var end = Math.min(to.line, self.lastLine());</span> <span class='diff-add'> if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end;</span> <span class='diff-add'> var pad = options.padding == null ? " " : options.padding;</span> <span class='diff-add'> if (from.line > end) return;</span> <span class='diff-add'> self.operation(function() {</span> <span class='diff-add'> if (options.fullLines != false) {</span> <span class='diff-add'> var lastLineHasText = nonWS.test(self.getLine(end));</span> <span class='diff-add'> self.replaceRange(pad + endString, Pos(end));</span> <span class='diff-add'> self.replaceRange(startString + pad, Pos(from.line, 0));</span> <span class='diff-add'> var lead = options.blockCommentLead || mode.blockCommentLead;</span> <span class='diff-add'> if (lead != null) for (var i = from.line + 1; i <= end; ++i)</span> <span class='diff-add'> if (i != end || lastLineHasText)</span> <span class='diff-add'> self.replaceRange(lead + pad, Pos(i, 0));</span> <span class='diff-add'> } else {</span> <span class='diff-add'> self.replaceRange(endString, to);</span> <span class='diff-add'> self.replaceRange(startString, from);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> });</span> <span class='diff-add'> CodeMirror.defineExtension("uncomment", function(from, to, options) {</span> <span class='diff-add'> if (!options) options = noOptions;</span> <span class='diff-add'> var self = this, mode = self.getModeAt(from);</span> <span class='diff-add'> var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end);</span> <span class='diff-add'> // Try finding line comments</span> <span class='diff-add'> var lineString = options.lineComment || mode.lineComment, lines = [];</span> <span class='diff-add'> var pad = options.padding == null ? " " : options.padding, didSomething;</span> <span class='diff-add'> lineComment: {</span> <span class='diff-add'> if (!lineString) break lineComment;</span> <span class='diff-add'> for (var i = start; i <= end; ++i) {</span> <span class='diff-add'> var line = self.getLine(i);</span> <span class='diff-add'> var found = line.indexOf(lineString);</span> <span class='diff-add'> if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1;</span> <span class='diff-add'> if (found == -1 && (i != end || i == start) && nonWS.test(line)) break lineComment;</span> <span class='diff-add'> if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment;</span> <span class='diff-add'> lines.push(line);</span> <span class='diff-add'> }</span> <span class='diff-add'> self.operation(function() {</span> <span class='diff-add'> for (var i = start; i <= end; ++i) {</span> <span class='diff-add'> var line = lines[i - start];</span> <span class='diff-add'> var pos = line.indexOf(lineString), endPos = pos + lineString.length;</span> <span class='diff-add'> if (pos < 0) continue;</span> <span class='diff-add'> if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length;</span> <span class='diff-add'> didSomething = true;</span> <span class='diff-add'> self.replaceRange("", Pos(i, pos), Pos(i, endPos));</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> if (didSomething) return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Try block comments</span> <span class='diff-add'> var startString = options.blockCommentStart || mode.blockCommentStart;</span> <span class='diff-add'> var endString = options.blockCommentEnd || mode.blockCommentEnd;</span> <span class='diff-add'> if (!startString || !endString) return false;</span> <span class='diff-add'> var lead = options.blockCommentLead || mode.blockCommentLead;</span> <span class='diff-add'> var startLine = self.getLine(start), endLine = end == start ? startLine : self.getLine(end);</span> <span class='diff-add'> var open = startLine.indexOf(startString), close = endLine.lastIndexOf(endString);</span> <span class='diff-add'> if (close == -1 && start != end) {</span> <span class='diff-add'> endLine = self.getLine(--end);</span> <span class='diff-add'> close = endLine.lastIndexOf(endString);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (open == -1 || close == -1 ||</span> <span class='diff-add'> !/comment/.test(self.getTokenTypeAt(Pos(start, open + 1))) ||</span> <span class='diff-add'> !/comment/.test(self.getTokenTypeAt(Pos(end, close + 1))))</span> <span class='diff-add'> return false;</span> <span class='diff-add'> // Avoid killing block comments completely outside the selection.</span> <span class='diff-add'> // Positions of the last startString before the start of the selection, and the first endString after it.</span> <span class='diff-add'> var lastStart = startLine.lastIndexOf(startString, from.ch);</span> <span class='diff-add'> var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length);</span> <span class='diff-add'> if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false;</span> <span class='diff-add'> // Positions of the first endString after the end of the selection, and the last startString before it.</span> <span class='diff-add'> firstEnd = endLine.indexOf(endString, to.ch);</span> <span class='diff-add'> var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch);</span> <span class='diff-add'> lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart;</span> <span class='diff-add'> if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false;</span> <span class='diff-add'> self.operation(function() {</span> <span class='diff-add'> self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)),</span> <span class='diff-add'> Pos(end, close + endString.length));</span> <span class='diff-add'> var openEnd = open + startString.length;</span> <span class='diff-add'> if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length;</span> <span class='diff-add'> self.replaceRange("", Pos(start, open), Pos(start, openEnd));</span> <span class='diff-add'> if (lead) for (var i = start + 1; i <= end; ++i) {</span> <span class='diff-add'> var line = self.getLine(i), found = line.indexOf(lead);</span> <span class='diff-add'> if (found == -1 || nonWS.test(line.slice(0, found))) continue;</span> <span class='diff-add'> var foundEnd = found + lead.length;</span> <span class='diff-add'> if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length;</span> <span class='diff-add'> self.replaceRange("", Pos(i, found), Pos(i, foundEnd));</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> return true;</span> <span class='diff-add'> });</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/completer.js b/ipynb/Array-feature-overlap-05_files/completer.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..5746b6d</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/completer.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> 'base/js/keyboard',</span> <span class='diff-add'> 'notebook/js/contexthint',</span> <span class='diff-add'> 'codemirror/lib/codemirror',</span> <span class='diff-add'>], function(IPython, $, utils, keyboard, CodeMirror) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> // easier key mapping</span> <span class='diff-add'> var keycodes = keyboard.keycodes;</span> <span class='diff-add'> var prepend_n_prc = function(str, n) {</span> <span class='diff-add'> for( var i =0 ; i< n ; i++){</span> <span class='diff-add'> str = '%'+str ;</span> <span class='diff-add'> }</span> <span class='diff-add'> return str;</span> <span class='diff-add'> };</span> <span class='diff-add'> var _existing_completion = function(item, completion_array){</span> <span class='diff-add'> for( var i=0; i < completion_array.length; i++) {</span> <span class='diff-add'> if (completion_array[i].trim().substr(-item.length) == item) {</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return false;</span> <span class='diff-add'> };</span> <span class='diff-add'> // what is the common start of all completions</span> <span class='diff-add'> function shared_start(B, drop_prct) {</span> <span class='diff-add'> if (B.length == 1) {</span> <span class='diff-add'> return B[0];</span> <span class='diff-add'> }</span> <span class='diff-add'> var A = [];</span> <span class='diff-add'> var common;</span> <span class='diff-add'> var min_lead_prct = 10;</span> <span class='diff-add'> for (var i = 0; i < B.length; i++) {</span> <span class='diff-add'> var str = B[i].str;</span> <span class='diff-add'> var localmin = 0;</span> <span class='diff-add'> if(drop_prct === true){</span> <span class='diff-add'> while ( str.substr(0, 1) == '%') {</span> <span class='diff-add'> localmin = localmin+1;</span> <span class='diff-add'> str = str.substring(1);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> min_lead_prct = Math.min(min_lead_prct, localmin);</span> <span class='diff-add'> A.push(str);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (A.length > 1) {</span> <span class='diff-add'> var tem1, tem2, s;</span> <span class='diff-add'> A = A.slice(0).sort();</span> <span class='diff-add'> tem1 = A[0];</span> <span class='diff-add'> s = tem1.length;</span> <span class='diff-add'> tem2 = A.pop();</span> <span class='diff-add'> while (s && tem2.indexOf(tem1) == -1) {</span> <span class='diff-add'> tem1 = tem1.substring(0, --s);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (tem1 === "" || tem2.indexOf(tem1) !== 0) {</span> <span class='diff-add'> return {</span> <span class='diff-add'> str:prepend_n_prc('', min_lead_prct),</span> <span class='diff-add'> type: "computed",</span> <span class='diff-add'> from: B[0].from,</span> <span class='diff-add'> to: B[0].to</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> return {</span> <span class='diff-add'> str: prepend_n_prc(tem1, min_lead_prct),</span> <span class='diff-add'> type: "computed",</span> <span class='diff-add'> from: B[0].from,</span> <span class='diff-add'> to: B[0].to</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> var Completer = function (cell, events) {</span> <span class='diff-add'> this.cell = cell;</span> <span class='diff-add'> this.editor = cell.code_mirror;</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> events.on('kernel_busy.Kernel', function () {</span> <span class='diff-add'> that.skip_kernel_completion = true;</span> <span class='diff-add'> });</span> <span class='diff-add'> events.on('kernel_idle.Kernel', function () {</span> <span class='diff-add'> that.skip_kernel_completion = false;</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> Completer.prototype.startCompletion = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * call for a 'first' completion, that will set the editor and do some</span> <span class='diff-add'> * special behavior like autopicking if only one completion available.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (this.editor.somethingSelected()|| this.editor.getSelections().length > 1) return;</span> <span class='diff-add'> this.done = false;</span> <span class='diff-add'> // use to get focus back on opera</span> <span class='diff-add'> this.carry_on_completion(true);</span> <span class='diff-add'> };</span> <span class='diff-add'> // easy access for julia to monkeypatch</span> <span class='diff-add'> //</span> <span class='diff-add'> Completer.reinvoke_re = /[%0-9a-z._/\\:~-]/i;</span> <span class='diff-add'> Completer.prototype.reinvoke= function(pre_cursor, block, cursor){</span> <span class='diff-add'> return Completer.reinvoke_re.test(pre_cursor);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> *</span> <span class='diff-add'> * pass true as parameter if this is the first invocation of the completer</span> <span class='diff-add'> * this will prevent the completer to dissmiss itself if it is not on a</span> <span class='diff-add'> * word boundary like pressing tab after a space, and make it autopick the</span> <span class='diff-add'> * only choice if there is only one which prevent from popping the UI. as</span> <span class='diff-add'> * well as fast-forwarding the typing if all completion have a common</span> <span class='diff-add'> * shared start</span> <span class='diff-add'> **/</span> <span class='diff-add'> Completer.prototype.carry_on_completion = function (first_invocation) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Pass true as parameter if you want the completer to autopick when</span> <span class='diff-add'> * only one completion. This function is automatically reinvoked at</span> <span class='diff-add'> * each keystroke with first_invocation = false</span> <span class='diff-add'> */</span> <span class='diff-add'> var cur = this.editor.getCursor();</span> <span class='diff-add'> var line = this.editor.getLine(cur.line);</span> <span class='diff-add'> var pre_cursor = this.editor.getRange({</span> <span class='diff-add'> line: cur.line,</span> <span class='diff-add'> ch: cur.ch - 1</span> <span class='diff-add'> }, cur);</span> <span class='diff-add'> // we need to check that we are still on a word boundary</span> <span class='diff-add'> // because while typing the completer is still reinvoking itself</span> <span class='diff-add'> // so dismiss if we are on a "bad" caracter</span> <span class='diff-add'> if (!this.reinvoke(pre_cursor) && !first_invocation) {</span> <span class='diff-add'> this.close();</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.autopick = false;</span> <span class='diff-add'> if (first_invocation) {</span> <span class='diff-add'> this.autopick = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> // We want a single cursor position.</span> <span class='diff-add'> if (this.editor.somethingSelected()|| this.editor.getSelections().length > 1) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> // one kernel completion came back, finish_completing will be called with the results</span> <span class='diff-add'> // we fork here and directly call finish completing if kernel is busy</span> <span class='diff-add'> var cursor_pos = utils.to_absolute_cursor_pos(this.editor, cur);</span> <span class='diff-add'> if (this.skip_kernel_completion) {</span> <span class='diff-add'> this.finish_completing({ content: {</span> <span class='diff-add'> matches: [],</span> <span class='diff-add'> cursor_start: cursor_pos,</span> <span class='diff-add'> cursor_end: cursor_pos,</span> <span class='diff-add'> }});</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.cell.kernel.complete(this.editor.getValue(), cursor_pos,</span> <span class='diff-add'> $.proxy(this.finish_completing, this)</span> <span class='diff-add'> );</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> Completer.prototype.finish_completing = function (msg) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * let's build a function that wrap all that stuff into what is needed</span> <span class='diff-add'> * for the new completer:</span> <span class='diff-add'> */</span> <span class='diff-add'> var content = msg.content;</span> <span class='diff-add'> var start = content.cursor_start;</span> <span class='diff-add'> var end = content.cursor_end;</span> <span class='diff-add'> var matches = content.matches;</span> <span class='diff-add'> var cur = this.editor.getCursor();</span> <span class='diff-add'> if (end === null) {</span> <span class='diff-add'> // adapted message spec replies don't have cursor position info,</span> <span class='diff-add'> // interpret end=null as current position,</span> <span class='diff-add'> // and negative start relative to that</span> <span class='diff-add'> end = utils.to_absolute_cursor_pos(this.editor, cur);</span> <span class='diff-add'> if (start === null) {</span> <span class='diff-add'> start = end;</span> <span class='diff-add'> } else if (start < 0) {</span> <span class='diff-add'> start = end + start;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> var results = CodeMirror.contextHint(this.editor);</span> <span class='diff-add'> var filtered_results = [];</span> <span class='diff-add'> //remove results from context completion</span> <span class='diff-add'> //that are already in kernel completion</span> <span class='diff-add'> var i;</span> <span class='diff-add'> for (i=0; i < results.length; i++) {</span> <span class='diff-add'> if (!_existing_completion(results[i].str, matches)) {</span> <span class='diff-add'> filtered_results.push(results[i]);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // append the introspection result, in order, at at the beginning of</span> <span class='diff-add'> // the table and compute the replacement range from current cursor</span> <span class='diff-add'> // positon and matched_text length.</span> <span class='diff-add'> for (i = matches.length - 1; i >= 0; --i) {</span> <span class='diff-add'> filtered_results.unshift({</span> <span class='diff-add'> str: matches[i],</span> <span class='diff-add'> type: "introspection",</span> <span class='diff-add'> from: utils.from_absolute_cursor_pos(this.editor, start),</span> <span class='diff-add'> to: utils.from_absolute_cursor_pos(this.editor, end)</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> // one the 2 sources results have been merge, deal with it</span> <span class='diff-add'> this.raw_result = filtered_results;</span> <span class='diff-add'> // if empty result return</span> <span class='diff-add'> if (!this.raw_result || !this.raw_result.length) return;</span> <span class='diff-add'> // When there is only one completion, use it directly.</span> <span class='diff-add'> if (this.autopick && this.raw_result.length == 1) {</span> <span class='diff-add'> this.insert(this.raw_result[0]);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.raw_result.length == 1) {</span> <span class='diff-add'> // test if first and only completion totally matches</span> <span class='diff-add'> // what is typed, in this case dismiss</span> <span class='diff-add'> var str = this.raw_result[0].str;</span> <span class='diff-add'> var pre_cursor = this.editor.getRange({</span> <span class='diff-add'> line: cur.line,</span> <span class='diff-add'> ch: cur.ch - str.length</span> <span class='diff-add'> }, cur);</span> <span class='diff-add'> if (pre_cursor == str) {</span> <span class='diff-add'> this.close();</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!this.visible) {</span> <span class='diff-add'> this.complete = $('<div/>').addClass('completions');</span> <span class='diff-add'> this.complete.attr('id', 'complete');</span> <span class='diff-add'> // Currently webkit doesn't use the size attr correctly. See:</span> <span class='diff-add'> // https://code.google.com/p/chromium/issues/detail?id=4579</span> <span class='diff-add'> this.sel = $('<select/>')</span> <span class='diff-add'> .attr('tabindex', -1)</span> <span class='diff-add'> .attr('multiple', 'true');</span> <span class='diff-add'> this.complete.append(this.sel);</span> <span class='diff-add'> this.visible = true;</span> <span class='diff-add'> $('body').append(this.complete);</span> <span class='diff-add'> //build the container</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.sel.dblclick(function () {</span> <span class='diff-add'> that.pick();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.sel.focus(function () {</span> <span class='diff-add'> that.editor.focus();</span> <span class='diff-add'> });</span> <span class='diff-add'> this._handle_keydown = function (cm, event) {</span> <span class='diff-add'> that.keydown(event);</span> <span class='diff-add'> };</span> <span class='diff-add'> this.editor.on('keydown', this._handle_keydown);</span> <span class='diff-add'> this._handle_keypress = function (cm, event) {</span> <span class='diff-add'> that.keypress(event);</span> <span class='diff-add'> };</span> <span class='diff-add'> this.editor.on('keypress', this._handle_keypress);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.sel.attr('size', Math.min(10, this.raw_result.length));</span> <span class='diff-add'> // After everything is on the page, compute the postion.</span> <span class='diff-add'> // We put it above the code if it is too close to the bottom of the page.</span> <span class='diff-add'> var pos = this.editor.cursorCoords(</span> <span class='diff-add'> utils.from_absolute_cursor_pos(this.editor, start)</span> <span class='diff-add'> );</span> <span class='diff-add'> var left = pos.left-3;</span> <span class='diff-add'> var top;</span> <span class='diff-add'> var cheight = this.complete.height();</span> <span class='diff-add'> var wheight = $(window).height();</span> <span class='diff-add'> if (pos.bottom+cheight+5 > wheight) {</span> <span class='diff-add'> top = pos.top-cheight-4;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> top = pos.bottom+1;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.complete.css('left', left + 'px');</span> <span class='diff-add'> this.complete.css('top', top + 'px');</span> <span class='diff-add'> // Clear and fill the list.</span> <span class='diff-add'> this.sel.text('');</span> <span class='diff-add'> this.build_gui_list(this.raw_result);</span> <span class='diff-add'> return true;</span> <span class='diff-add'> };</span> <span class='diff-add'> Completer.prototype.insert = function (completion) {</span> <span class='diff-add'> this.editor.replaceRange(completion.str, completion.from, completion.to);</span> <span class='diff-add'> };</span> <span class='diff-add'> Completer.prototype.build_gui_list = function (completions) {</span> <span class='diff-add'> for (var i = 0; i < completions.length; ++i) {</span> <span class='diff-add'> var opt = $('<option/>').text(completions[i].str).addClass(completions[i].type);</span> <span class='diff-add'> this.sel.append(opt);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.sel.children().first().attr('selected', 'true');</span> <span class='diff-add'> this.sel.scrollTop(0);</span> <span class='diff-add'> };</span> <span class='diff-add'> Completer.prototype.close = function () {</span> <span class='diff-add'> this.done = true;</span> <span class='diff-add'> $('#complete').remove();</span> <span class='diff-add'> this.editor.off('keydown', this._handle_keydown);</span> <span class='diff-add'> this.editor.off('keypress', this._handle_keypress);</span> <span class='diff-add'> this.visible = false;</span> <span class='diff-add'> };</span> <span class='diff-add'> Completer.prototype.pick = function () {</span> <span class='diff-add'> this.insert(this.raw_result[this.sel[0].selectedIndex]);</span> <span class='diff-add'> this.close();</span> <span class='diff-add'> };</span> <span class='diff-add'> Completer.prototype.keydown = function (event) {</span> <span class='diff-add'> var code = event.keyCode;</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> // Enter</span> <span class='diff-add'> if (code == keycodes.enter) {</span> <span class='diff-add'> event.codemirrorIgnore = true;</span> <span class='diff-add'> event._ipkmIgnore = true;</span> <span class='diff-add'> event.preventDefault();</span> <span class='diff-add'> this.pick();</span> <span class='diff-add'> // Escape or backspace</span> <span class='diff-add'> } else if (code == keycodes.esc || code == keycodes.backspace) {</span> <span class='diff-add'> event.codemirrorIgnore = true;</span> <span class='diff-add'> event._ipkmIgnore = true;</span> <span class='diff-add'> event.preventDefault();</span> <span class='diff-add'> this.close();</span> <span class='diff-add'> } else if (code == keycodes.tab) {</span> <span class='diff-add'> //all the fastforwarding operation,</span> <span class='diff-add'> //Check that shared start is not null which can append with prefixed completion</span> <span class='diff-add'> // like %pylab , pylab have no shred start, and ff will result in py<tab><tab></span> <span class='diff-add'> // to erase py</span> <span class='diff-add'> var sh = shared_start(this.raw_result, true);</span> <span class='diff-add'> if (sh) {</span> <span class='diff-add'> this.insert(sh);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.close();</span> <span class='diff-add'> //reinvoke self</span> <span class='diff-add'> setTimeout(function () {</span> <span class='diff-add'> that.carry_on_completion();</span> <span class='diff-add'> }, 50);</span> <span class='diff-add'> } else if (code == keycodes.up || code == keycodes.down) {</span> <span class='diff-add'> // need to do that to be able to move the arrow</span> <span class='diff-add'> // when on the first or last line ofo a code cell</span> <span class='diff-add'> event.codemirrorIgnore = true;</span> <span class='diff-add'> event._ipkmIgnore = true;</span> <span class='diff-add'> event.preventDefault();</span> <span class='diff-add'> var options = this.sel.find('option');</span> <span class='diff-add'> var index = this.sel[0].selectedIndex;</span> <span class='diff-add'> if (code == keycodes.up) {</span> <span class='diff-add'> index--;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code == keycodes.down) {</span> <span class='diff-add'> index++;</span> <span class='diff-add'> }</span> <span class='diff-add'> index = Math.min(Math.max(index, 0), options.length-1);</span> <span class='diff-add'> this.sel[0].selectedIndex = index;</span> <span class='diff-add'> } else if (code == keycodes.pageup || code == keycodes.pagedown) {</span> <span class='diff-add'> event._ipkmIgnore = true;</span> <span class='diff-add'> var options = this.sel.find('option');</span> <span class='diff-add'> var index = this.sel[0].selectedIndex;</span> <span class='diff-add'> if (code == keycodes.pageup) {</span> <span class='diff-add'> index -= 10; // As 10 is the hard coded size of the drop down menu</span> <span class='diff-add'> } else {</span> <span class='diff-add'> index += 10;</span> <span class='diff-add'> }</span> <span class='diff-add'> index = Math.min(Math.max(index, 0), options.length-1);</span> <span class='diff-add'> this.sel[0].selectedIndex = index;</span> <span class='diff-add'> } else if (code == keycodes.left || code == keycodes.right) {</span> <span class='diff-add'> this.close();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> Completer.prototype.keypress = function (event) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * FIXME: This is a band-aid.</span> <span class='diff-add'> * on keypress, trigger insertion of a single character.</span> <span class='diff-add'> * This simulates the old behavior of completion as you type,</span> <span class='diff-add'> * before events were disconnected and CodeMirror stopped</span> <span class='diff-add'> * receiving events while the completer is focused.</span> <span class='diff-add'> */</span> <span class='diff-add'> </span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var code = event.keyCode;</span> <span class='diff-add'> </span> <span class='diff-add'> // don't handle keypress if it's not a character (arrows on FF)</span> <span class='diff-add'> // or ENTER/TAB</span> <span class='diff-add'> if (event.charCode === 0 ||</span> <span class='diff-add'> code == keycodes.tab ||</span> <span class='diff-add'> code == keycodes.enter</span> <span class='diff-add'> ) return;</span> <span class='diff-add'> </span> <span class='diff-add'> this.close();</span> <span class='diff-add'> this.editor.focus();</span> <span class='diff-add'> setTimeout(function () {</span> <span class='diff-add'> that.carry_on_completion();</span> <span class='diff-add'> }, 50);</span> <span class='diff-add'> };</span> <span class='diff-add'> // For backwards compatability.</span> <span class='diff-add'> IPython.Completer = Completer;</span> <span class='diff-add'> return {'Completer': Completer};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/config.js b/ipynb/Array-feature-overlap-05_files/config.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..0d2a9f9</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/config.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> ],</span> <span class='diff-add'>function($, utils) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var ConfigSection = function(section_name, options) {</span> <span class='diff-add'> this.section_name = section_name;</span> <span class='diff-add'> this.base_url = options.base_url;</span> <span class='diff-add'> this.data = {};</span> <span class='diff-add'> </span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> </span> <span class='diff-add'> /* .loaded is a promise, fulfilled the first time the config is loaded</span> <span class='diff-add'> * from the server. Code can do:</span> <span class='diff-add'> * conf.loaded.then(function() { ... using conf.data ... });</span> <span class='diff-add'> */</span> <span class='diff-add'> this._one_load_finished = false;</span> <span class='diff-add'> this.loaded = new Promise(function(resolve, reject) {</span> <span class='diff-add'> that._finish_firstload = resolve;</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> ConfigSection.prototype.api_url = function() {</span> <span class='diff-add'> return utils.url_join_encode(this.base_url, 'api/config', this.section_name);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> ConfigSection.prototype._load_done = function() {</span> <span class='diff-add'> if (!this._one_load_finished) {</span> <span class='diff-add'> this._one_load_finished = true;</span> <span class='diff-add'> this._finish_firstload();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> ConfigSection.prototype.load = function() {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> return utils.promising_ajax(this.api_url(), {</span> <span class='diff-add'> cache: false,</span> <span class='diff-add'> type: "GET",</span> <span class='diff-add'> dataType: "json",</span> <span class='diff-add'> }).then(function(data) {</span> <span class='diff-add'> that.data = data;</span> <span class='diff-add'> that._load_done();</span> <span class='diff-add'> return data;</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Modify the config values stored. Update the local data immediately,</span> <span class='diff-add'> * send the change to the server, and use the updated data from the server</span> <span class='diff-add'> * when the reply comes.</span> <span class='diff-add'> */</span> <span class='diff-add'> ConfigSection.prototype.update = function(newdata) {</span> <span class='diff-add'> $.extend(true, this.data, newdata); // true -> recursive update</span> <span class='diff-add'> </span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> return utils.promising_ajax(this.api_url(), {</span> <span class='diff-add'> processData: false,</span> <span class='diff-add'> type : "PATCH",</span> <span class='diff-add'> data: JSON.stringify(newdata),</span> <span class='diff-add'> dataType : "json",</span> <span class='diff-add'> contentType: 'application/json',</span> <span class='diff-add'> }).then(function(data) {</span> <span class='diff-add'> that.data = data;</span> <span class='diff-add'> that._load_done();</span> <span class='diff-add'> return data;</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> </span> <span class='diff-add'> var ConfigWithDefaults = function(section, defaults, classname) {</span> <span class='diff-add'> this.section = section;</span> <span class='diff-add'> this.defaults = defaults;</span> <span class='diff-add'> this.classname = classname;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> ConfigWithDefaults.prototype._class_data = function() {</span> <span class='diff-add'> if (this.classname) {</span> <span class='diff-add'> return this.section.data[this.classname] || {};</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return this.section.data</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Wait for config to have loaded, then get a value or the default.</span> <span class='diff-add'> * Returns a promise.</span> <span class='diff-add'> */</span> <span class='diff-add'> ConfigWithDefaults.prototype.get = function(key) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> return this.section.loaded.then(function() {</span> <span class='diff-add'> return this._class_data()[key] || this.defaults[key]</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Return a config value. If config is not yet loaded, return the default</span> <span class='diff-add'> * instead of waiting for it to load.</span> <span class='diff-add'> */</span> <span class='diff-add'> ConfigWithDefaults.prototype.get_sync = function(key) {</span> <span class='diff-add'> return this._class_data()[key] || this.defaults[key];</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a config value. Send the update to the server, and change our</span> <span class='diff-add'> * local copy of the data immediately.</span> <span class='diff-add'> * Returns a promise which is fulfilled when the server replies to the</span> <span class='diff-add'> * change.</span> <span class='diff-add'> */</span> <span class='diff-add'> ConfigWithDefaults.prototype.set = function(key, value) {</span> <span class='diff-add'> var d = {};</span> <span class='diff-add'> d[key] = value;</span> <span class='diff-add'> if (this.classname) {</span> <span class='diff-add'> var d2 = {};</span> <span class='diff-add'> d2[this.classname] = d;</span> <span class='diff-add'> return this.section.update(d2);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return this.section.update(d);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> return {ConfigSection: ConfigSection,</span> <span class='diff-add'> ConfigWithDefaults: ConfigWithDefaults,</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/contents.js b/ipynb/Array-feature-overlap-05_files/contents.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..263c052</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/contents.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define(function(require) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var $ = require('jquery');</span> <span class='diff-add'> var utils = require('base/js/utils');</span> <span class='diff-add'> var Contents = function(options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Constructor</span> <span class='diff-add'> *</span> <span class='diff-add'> * A contents handles passing file operations</span> <span class='diff-add'> * to the back-end. This includes checkpointing</span> <span class='diff-add'> * with the normal file operations.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters:</span> <span class='diff-add'> * options: dictionary</span> <span class='diff-add'> * Dictionary of keyword arguments.</span> <span class='diff-add'> * base_url: string</span> <span class='diff-add'> */</span> <span class='diff-add'> this.base_url = options.base_url;</span> <span class='diff-add'> };</span> <span class='diff-add'> /** Error type */</span> <span class='diff-add'> Contents.DIRECTORY_NOT_EMPTY_ERROR = 'DirectoryNotEmptyError';</span> <span class='diff-add'> Contents.DirectoryNotEmptyError = function() {</span> <span class='diff-add'> // Constructor</span> <span class='diff-add'> //</span> <span class='diff-add'> // An error representing the result of attempting to delete a non-empty</span> <span class='diff-add'> // directory.</span> <span class='diff-add'> this.message = 'A directory must be empty before being deleted.';</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> Contents.DirectoryNotEmptyError.prototype = Object.create(Error.prototype);</span> <span class='diff-add'> Contents.DirectoryNotEmptyError.prototype.name =</span> <span class='diff-add'> Contents.DIRECTORY_NOT_EMPTY_ERROR;</span> <span class='diff-add'> Contents.prototype.api_url = function() {</span> <span class='diff-add'> var url_parts = [this.base_url, 'api/contents'].concat(</span> <span class='diff-add'> Array.prototype.slice.apply(arguments));</span> <span class='diff-add'> return utils.url_join_encode.apply(null, url_parts);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Creates a basic error handler that wraps a jqXHR error as an Error.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Takes a callback that accepts an Error, and returns a callback that can</span> <span class='diff-add'> * be passed directly to $.ajax, which will wrap the error from jQuery</span> <span class='diff-add'> * as an Error, and pass that to the original callback.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method create_basic_error_handler</span> <span class='diff-add'> * @param{Function} callback</span> <span class='diff-add'> * @return{Function}</span> <span class='diff-add'> */</span> <span class='diff-add'> Contents.prototype.create_basic_error_handler = function(callback) {</span> <span class='diff-add'> if (!callback) {</span> <span class='diff-add'> return utils.log_ajax_error;</span> <span class='diff-add'> }</span> <span class='diff-add'> return function(xhr, status, error) {</span> <span class='diff-add'> callback(utils.wrap_ajax_error(xhr, status, error));</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * File Functions (including notebook operations)</span> <span class='diff-add'> */</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get a file.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method get</span> <span class='diff-add'> * @param {String} path</span> <span class='diff-add'> * @param {Object} options</span> <span class='diff-add'> * type : 'notebook', 'file', or 'directory'</span> <span class='diff-add'> * format: 'text' or 'base64'; only relevant for type: 'file'</span> <span class='diff-add'> * content: true or false; // whether to include the content</span> <span class='diff-add'> */</span> <span class='diff-add'> Contents.prototype.get = function (path, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * We do the call with settings so we can set cache to false.</span> <span class='diff-add'> */</span> <span class='diff-add'> var settings = {</span> <span class='diff-add'> processData : false,</span> <span class='diff-add'> cache : false,</span> <span class='diff-add'> type : "GET",</span> <span class='diff-add'> dataType : "json",</span> <span class='diff-add'> };</span> <span class='diff-add'> var url = this.api_url(path);</span> <span class='diff-add'> var params = {};</span> <span class='diff-add'> if (options.type) { params.type = options.type; }</span> <span class='diff-add'> if (options.format) { params.format = options.format; }</span> <span class='diff-add'> if (options.content === false) { params.content = '0'; }</span> <span class='diff-add'> return utils.promising_ajax(url + '?' + $.param(params), settings);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Creates a new untitled file or directory in the specified directory path.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method new</span> <span class='diff-add'> * @param {String} path: the directory in which to create the new file/directory</span> <span class='diff-add'> * @param {Object} options:</span> <span class='diff-add'> * ext: file extension to use</span> <span class='diff-add'> * type: model type to create ('notebook', 'file', or 'directory')</span> <span class='diff-add'> */</span> <span class='diff-add'> Contents.prototype.new_untitled = function(path, options) {</span> <span class='diff-add'> var data = JSON.stringify({</span> <span class='diff-add'> ext: options.ext,</span> <span class='diff-add'> type: options.type</span> <span class='diff-add'> });</span> <span class='diff-add'> var settings = {</span> <span class='diff-add'> processData : false,</span> <span class='diff-add'> type : "POST",</span> <span class='diff-add'> data: data,</span> <span class='diff-add'> dataType : "json",</span> <span class='diff-add'> };</span> <span class='diff-add'> return utils.promising_ajax(this.api_url(path), settings);</span> <span class='diff-add'> };</span> <span class='diff-add'> Contents.prototype.delete = function(path) {</span> <span class='diff-add'> var settings = {</span> <span class='diff-add'> processData : false,</span> <span class='diff-add'> type : "DELETE",</span> <span class='diff-add'> dataType : "json",</span> <span class='diff-add'> };</span> <span class='diff-add'> var url = this.api_url(path);</span> <span class='diff-add'> return utils.promising_ajax(url, settings).catch(</span> <span class='diff-add'> // Translate certain errors to more specific ones.</span> <span class='diff-add'> function(error) {</span> <span class='diff-add'> // TODO: update IPEP27 to specify errors more precisely, so</span> <span class='diff-add'> // that error types can be detected here with certainty.</span> <span class='diff-add'> if (error.xhr.status === 400) {</span> <span class='diff-add'> throw new Contents.DirectoryNotEmptyError();</span> <span class='diff-add'> }</span> <span class='diff-add'> throw error;</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> Contents.prototype.rename = function(path, new_path) {</span> <span class='diff-add'> var data = {path: new_path};</span> <span class='diff-add'> var settings = {</span> <span class='diff-add'> processData : false,</span> <span class='diff-add'> type : "PATCH",</span> <span class='diff-add'> data : JSON.stringify(data),</span> <span class='diff-add'> dataType: "json",</span> <span class='diff-add'> contentType: 'application/json',</span> <span class='diff-add'> };</span> <span class='diff-add'> var url = this.api_url(path);</span> <span class='diff-add'> return utils.promising_ajax(url, settings);</span> <span class='diff-add'> };</span> <span class='diff-add'> Contents.prototype.save = function(path, model) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * We do the call with settings so we can set cache to false.</span> <span class='diff-add'> */</span> <span class='diff-add'> var settings = {</span> <span class='diff-add'> processData : false,</span> <span class='diff-add'> type : "PUT",</span> <span class='diff-add'> dataType: "json",</span> <span class='diff-add'> data : JSON.stringify(model),</span> <span class='diff-add'> contentType: 'application/json',</span> <span class='diff-add'> };</span> <span class='diff-add'> var url = this.api_url(path);</span> <span class='diff-add'> return utils.promising_ajax(url, settings);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> Contents.prototype.copy = function(from_file, to_dir) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Copy a file into a given directory via POST</span> <span class='diff-add'> * The server will select the name of the copied file</span> <span class='diff-add'> */</span> <span class='diff-add'> var url = this.api_url(to_dir);</span> <span class='diff-add'> </span> <span class='diff-add'> var settings = {</span> <span class='diff-add'> processData : false,</span> <span class='diff-add'> type: "POST",</span> <span class='diff-add'> data: JSON.stringify({copy_from: from_file}),</span> <span class='diff-add'> dataType : "json",</span> <span class='diff-add'> };</span> <span class='diff-add'> return utils.promising_ajax(url, settings);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Checkpointing Functions</span> <span class='diff-add'> */</span> <span class='diff-add'> Contents.prototype.create_checkpoint = function(path) {</span> <span class='diff-add'> var url = this.api_url(path, 'checkpoints');</span> <span class='diff-add'> var settings = {</span> <span class='diff-add'> type : "POST",</span> <span class='diff-add'> dataType : "json",</span> <span class='diff-add'> };</span> <span class='diff-add'> return utils.promising_ajax(url, settings);</span> <span class='diff-add'> };</span> <span class='diff-add'> Contents.prototype.list_checkpoints = function(path) {</span> <span class='diff-add'> var url = this.api_url(path, 'checkpoints');</span> <span class='diff-add'> var settings = {</span> <span class='diff-add'> type : "GET",</span> <span class='diff-add'> cache: false,</span> <span class='diff-add'> dataType: "json",</span> <span class='diff-add'> };</span> <span class='diff-add'> return utils.promising_ajax(url, settings);</span> <span class='diff-add'> };</span> <span class='diff-add'> Contents.prototype.restore_checkpoint = function(path, checkpoint_id) {</span> <span class='diff-add'> var url = this.api_url(path, 'checkpoints', checkpoint_id);</span> <span class='diff-add'> var settings = {</span> <span class='diff-add'> type : "POST",</span> <span class='diff-add'> };</span> <span class='diff-add'> return utils.promising_ajax(url, settings);</span> <span class='diff-add'> };</span> <span class='diff-add'> Contents.prototype.delete_checkpoint = function(path, checkpoint_id) {</span> <span class='diff-add'> var url = this.api_url(path, 'checkpoints', checkpoint_id);</span> <span class='diff-add'> var settings = {</span> <span class='diff-add'> type : "DELETE",</span> <span class='diff-add'> };</span> <span class='diff-add'> return utils.promising_ajax(url, settings);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * File management functions</span> <span class='diff-add'> */</span> <span class='diff-add'> /**</span> <span class='diff-add'> * List notebooks and directories at a given path</span> <span class='diff-add'> *</span> <span class='diff-add'> * On success, load_callback is called with an array of dictionaries</span> <span class='diff-add'> * representing individual files or directories. Each dictionary has</span> <span class='diff-add'> * the keys:</span> <span class='diff-add'> * type: "notebook" or "directory"</span> <span class='diff-add'> * created: created date</span> <span class='diff-add'> * last_modified: last modified dat</span> <span class='diff-add'> * @method list_notebooks</span> <span class='diff-add'> * @param {String} path The path to list notebooks in</span> <span class='diff-add'> */</span> <span class='diff-add'> Contents.prototype.list_contents = function(path) {</span> <span class='diff-add'> return this.get(path, {type: 'directory'});</span> <span class='diff-add'> };</span> <span class='diff-add'> return {'Contents': Contents};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/contexthint.js b/ipynb/Array-feature-overlap-05_files/contexthint.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..30b7cd7</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/contexthint.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>// highly adapted for codemiror jshint</span> <span class='diff-add'>define(['codemirror/lib/codemirror'], function(CodeMirror) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var forEach = function(arr, f) {</span> <span class='diff-add'> for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);</span> <span class='diff-add'> };</span> <span class='diff-add'> var arrayContains = function(arr, item) {</span> <span class='diff-add'> if (!Array.prototype.indexOf) {</span> <span class='diff-add'> var i = arr.length;</span> <span class='diff-add'> while (i--) {</span> <span class='diff-add'> if (arr[i] === item) {</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> return arr.indexOf(item) != -1;</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeMirror.contextHint = function (editor) {</span> <span class='diff-add'> // Find the token at the cursor</span> <span class='diff-add'> var cur = editor.getCursor(),</span> <span class='diff-add'> token = editor.getTokenAt(cur),</span> <span class='diff-add'> tprop = token;</span> <span class='diff-add'> // If it's not a 'word-style' token, ignore the token.</span> <span class='diff-add'> // If it is a property, find out what it is a property of.</span> <span class='diff-add'> var list = [];</span> <span class='diff-add'> var clist = getCompletions(token, editor);</span> <span class='diff-add'> for (var i = 0; i < clist.length; i++) {</span> <span class='diff-add'> list.push({</span> <span class='diff-add'> str: clist[i],</span> <span class='diff-add'> type: "context",</span> <span class='diff-add'> from: {</span> <span class='diff-add'> line: cur.line,</span> <span class='diff-add'> ch: token.start</span> <span class='diff-add'> },</span> <span class='diff-add'> to: {</span> <span class='diff-add'> line: cur.line,</span> <span class='diff-add'> ch: token.end</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> return list;</span> <span class='diff-add'> };</span> <span class='diff-add'> // find all 'words' of current cell</span> <span class='diff-add'> var getAllTokens = function (editor) {</span> <span class='diff-add'> var found = [];</span> <span class='diff-add'> // add to found if not already in it</span> <span class='diff-add'> function maybeAdd(str) {</span> <span class='diff-add'> if (!arrayContains(found, str)) found.push(str);</span> <span class='diff-add'> }</span> <span class='diff-add'> // loop through all token on all lines</span> <span class='diff-add'> var lineCount = editor.lineCount();</span> <span class='diff-add'> // loop on line</span> <span class='diff-add'> for (var l = 0; l < lineCount; l++) {</span> <span class='diff-add'> var line = editor.getLine(l);</span> <span class='diff-add'> //loop on char</span> <span class='diff-add'> for (var c = 1; c < line.length; c++) {</span> <span class='diff-add'> var tk = editor.getTokenAt({</span> <span class='diff-add'> line: l,</span> <span class='diff-add'> ch: c</span> <span class='diff-add'> });</span> <span class='diff-add'> // if token has a class, it has geat chances of beeing</span> <span class='diff-add'> // of interest. Add it to the list of possible completions.</span> <span class='diff-add'> // we could skip token of ClassName 'comment'</span> <span class='diff-add'> // or 'number' and 'operator'</span> <span class='diff-add'> if (tk.className !== null) {</span> <span class='diff-add'> maybeAdd(tk.string);</span> <span class='diff-add'> }</span> <span class='diff-add'> // jump to char after end of current token</span> <span class='diff-add'> c = tk.end;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return found;</span> <span class='diff-add'> };</span> <span class='diff-add'> var getCompletions = function(token, editor) {</span> <span class='diff-add'> var candidates = getAllTokens(editor);</span> <span class='diff-add'> // filter all token that have a common start (but nox exactly) the lenght of the current token</span> <span class='diff-add'> var lambda = function (x) {</span> <span class='diff-add'> return (x.indexOf(token.string) === 0 && x != token.string);</span> <span class='diff-add'> };</span> <span class='diff-add'> var filterd = candidates.filter(lambda);</span> <span class='diff-add'> return filterd;</span> <span class='diff-add'> };</span> <span class='diff-add'> return {'contextHint': CodeMirror.contextHint};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/custom.css b/ipynb/Array-feature-overlap-05_files/custom.css</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..9f4abda</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/custom.css</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>/*</span> <span class='diff-add'>Placeholder for custom user CSS</span> <span class='diff-add'>mainly to be overridden in profile/static/custom/custom.css</span> <span class='diff-add'>This will always be an empty file in IPython</span> <span class='diff-add'>*/</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/custom.js b/ipynb/Array-feature-overlap-05_files/custom.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..f8d1afe</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/custom.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// leave at least 2 line with only a star on it below, or doc generation fails</span> <span class='diff-add'>/**</span> <span class='diff-add'> *</span> <span class='diff-add'> *</span> <span class='diff-add'> * Placeholder for custom user javascript</span> <span class='diff-add'> * mainly to be overridden in profile/static/custom/custom.js</span> <span class='diff-add'> * This will always be an empty file in IPython</span> <span class='diff-add'> *</span> <span class='diff-add'> * User could add any javascript in the `profile/static/custom/custom.js` file</span> <span class='diff-add'> * (and should create it if it does not exist).</span> <span class='diff-add'> * It will be executed by the ipython notebook at load time.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Same thing with `profile/static/custom/custom.css` to inject custom css into the notebook.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Example :</span> <span class='diff-add'> *</span> <span class='diff-add'> * Create a custom button in toolbar that execute `%qtconsole` in kernel</span> <span class='diff-add'> * and hence open a qtconsole attached to the same kernel as the current notebook</span> <span class='diff-add'> *</span> <span class='diff-add'> * $([IPython.events]).on('app_initialized.NotebookApp', function(){</span> <span class='diff-add'> * IPython.toolbar.add_buttons_group([</span> <span class='diff-add'> * {</span> <span class='diff-add'> * 'label' : 'run qtconsole',</span> <span class='diff-add'> * 'icon' : 'icon-terminal', // select your icon from http://fortawesome.github.io/Font-Awesome/icons</span> <span class='diff-add'> * 'callback': function () {</span> <span class='diff-add'> * IPython.notebook.kernel.execute('%qtconsole')</span> <span class='diff-add'> * }</span> <span class='diff-add'> * }</span> <span class='diff-add'> * // add more button here if needed.</span> <span class='diff-add'> * ]);</span> <span class='diff-add'> * });</span> <span class='diff-add'> *</span> <span class='diff-add'> * Example :</span> <span class='diff-add'> *</span> <span class='diff-add'> * Use `jQuery.getScript(url [, success(script, textStatus, jqXHR)] );`</span> <span class='diff-add'> * to load custom script into the notebook.</span> <span class='diff-add'> *</span> <span class='diff-add'> * // to load the metadata ui extension example.</span> <span class='diff-add'> * $.getScript('/static/notebook/js/celltoolbarpresets/example.js');</span> <span class='diff-add'> * // or</span> <span class='diff-add'> * // to load the metadata ui extension to control slideshow mode / reveal js for nbconvert</span> <span class='diff-add'> * $.getScript('/static/notebook/js/celltoolbarpresets/slideshow.js');</span> <span class='diff-add'> *</span> <span class='diff-add'> *</span> <span class='diff-add'> * @module IPython</span> <span class='diff-add'> * @namespace IPython</span> <span class='diff-add'> * @class customjs</span> <span class='diff-add'> * @static</span> <span class='diff-add'> */</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/default.js b/ipynb/Array-feature-overlap-05_files/default.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..1423738</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/default.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'notebook/js/celltoolbar',</span> <span class='diff-add'> 'base/js/dialog',</span> <span class='diff-add'>], function($, celltoolbar, dialog) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var CellToolbar = celltoolbar.CellToolbar;</span> <span class='diff-add'> var raw_edit = function (cell) {</span> <span class='diff-add'> dialog.edit_metadata({</span> <span class='diff-add'> md: cell.metadata,</span> <span class='diff-add'> callback: function (md) {</span> <span class='diff-add'> cell.metadata = md;</span> <span class='diff-add'> },</span> <span class='diff-add'> name: 'Cell',</span> <span class='diff-add'> notebook: this.notebook,</span> <span class='diff-add'> keyboard_manager: this.keyboard_manager</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> var add_raw_edit_button = function(div, cell) {</span> <span class='diff-add'> var button_container = $(div);</span> <span class='diff-add'> var button = $('<button/>')</span> <span class='diff-add'> .addClass("btn btn-default btn-xs")</span> <span class='diff-add'> .text("Edit Metadata")</span> <span class='diff-add'> .click( function () {</span> <span class='diff-add'> raw_edit(cell);</span> <span class='diff-add'> return false;</span> <span class='diff-add'> });</span> <span class='diff-add'> button_container.append(button);</span> <span class='diff-add'> };</span> <span class='diff-add'> var register = function (notebook) {</span> <span class='diff-add'> CellToolbar.register_callback('default.rawedit', add_raw_edit_button);</span> <span class='diff-add'> raw_edit = $.proxy(raw_edit, {</span> <span class='diff-add'> notebook: notebook,</span> <span class='diff-add'> keyboard_manager: notebook.keyboard_manager</span> <span class='diff-add'> });</span> <span class='diff-add'> var example_preset = [];</span> <span class='diff-add'> example_preset.push('default.rawedit');</span> <span class='diff-add'> CellToolbar.register_preset('Edit Metadata', example_preset, notebook);</span> <span class='diff-add'> console.log('Default extension for cell metadata editing loaded.');</span> <span class='diff-add'> };</span> <span class='diff-add'> return {'register': register};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/dialog.js b/ipynb/Array-feature-overlap-05_files/dialog.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..79ac239</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/dialog.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define(function(require) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var CodeMirror = require('codemirror/lib/codemirror');</span> <span class='diff-add'> var IPython = require('base/js/namespace');</span> <span class='diff-add'> var $ = require('jquery');</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * A wrapper around bootstrap modal for easier use</span> <span class='diff-add'> * Pass it an option dictionary with the following properties:</span> <span class='diff-add'> *</span> <span class='diff-add'> * - body : <string> or <DOM node>, main content of the dialog</span> <span class='diff-add'> * if pass a <string> it will be wrapped in a p tag and</span> <span class='diff-add'> * html element escaped, unless you specify sanitize=false</span> <span class='diff-add'> * option.</span> <span class='diff-add'> * - title : Dialog title, default to empty string.</span> <span class='diff-add'> * - buttons : dict of btn_options who keys are button label.</span> <span class='diff-add'> * see btn_options below for description</span> <span class='diff-add'> * - open : callback to trigger on dialog open.</span> <span class='diff-add'> * - destroy:</span> <span class='diff-add'> * - notebook : notebook instance</span> <span class='diff-add'> * - keyboard_manager: keyboard manager instance.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Unlike bootstrap modals, the backdrop options is set by default </span> <span class='diff-add'> * to 'static'.</span> <span class='diff-add'> *</span> <span class='diff-add'> * The rest of the options are passed as is to bootstrap modals. </span> <span class='diff-add'> *</span> <span class='diff-add'> * btn_options: dict with the following property:</span> <span class='diff-add'> * </span> <span class='diff-add'> * - click : callback to trigger on click</span> <span class='diff-add'> * - class : css classes to add to button.</span> <span class='diff-add'> *</span> <span class='diff-add'> *</span> <span class='diff-add'> *</span> <span class='diff-add'> **/</span> <span class='diff-add'> var modal = function (options) {</span> <span class='diff-add'> var modal = $("<div/>")</span> <span class='diff-add'> .addClass("modal")</span> <span class='diff-add'> .addClass("fade")</span> <span class='diff-add'> .attr("role", "dialog");</span> <span class='diff-add'> var dialog = $("<div/>")</span> <span class='diff-add'> .addClass("modal-dialog")</span> <span class='diff-add'> .appendTo(modal);</span> <span class='diff-add'> var dialog_content = $("<div/>")</span> <span class='diff-add'> .addClass("modal-content")</span> <span class='diff-add'> .appendTo(dialog);</span> <span class='diff-add'> if(typeof(options.body) === 'string' && options.sanitize !== false){</span> <span class='diff-add'> options.body = $("<p/>").text(options.body)</span> <span class='diff-add'> }</span> <span class='diff-add'> dialog_content.append(</span> <span class='diff-add'> $("<div/>")</span> <span class='diff-add'> .addClass("modal-header")</span> <span class='diff-add'> .append($("<button>")</span> <span class='diff-add'> .attr("type", "button")</span> <span class='diff-add'> .addClass("close")</span> <span class='diff-add'> .attr("data-dismiss", "modal")</span> <span class='diff-add'> .attr("aria-hidden", "true")</span> <span class='diff-add'> .html("×")</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $("<h4/>")</span> <span class='diff-add'> .addClass('modal-title')</span> <span class='diff-add'> .text(options.title || "")</span> <span class='diff-add'> )</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $("<div/>").addClass("modal-body").append(</span> <span class='diff-add'> options.body || $("<p/>")</span> <span class='diff-add'> )</span> <span class='diff-add'> );</span> <span class='diff-add'> </span> <span class='diff-add'> var footer = $("<div/>").addClass("modal-footer");</span> <span class='diff-add'> </span> <span class='diff-add'> for (var label in options.buttons) {</span> <span class='diff-add'> var btn_opts = options.buttons[label];</span> <span class='diff-add'> var button = $("<button/>")</span> <span class='diff-add'> .addClass("btn btn-default btn-sm")</span> <span class='diff-add'> .attr("data-dismiss", "modal")</span> <span class='diff-add'> .text(label);</span> <span class='diff-add'> if (btn_opts.click) {</span> <span class='diff-add'> button.click($.proxy(btn_opts.click, dialog_content));</span> <span class='diff-add'> }</span> <span class='diff-add'> if (btn_opts.class) {</span> <span class='diff-add'> button.addClass(btn_opts.class);</span> <span class='diff-add'> }</span> <span class='diff-add'> footer.append(button);</span> <span class='diff-add'> }</span> <span class='diff-add'> dialog_content.append(footer);</span> <span class='diff-add'> // hook up on-open event</span> <span class='diff-add'> modal.on("shown.bs.modal", function() {</span> <span class='diff-add'> setTimeout(function() {</span> <span class='diff-add'> footer.find("button").last().focus();</span> <span class='diff-add'> if (options.open) {</span> <span class='diff-add'> $.proxy(options.open, modal)();</span> <span class='diff-add'> }</span> <span class='diff-add'> }, 0);</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> // destroy modal on hide, unless explicitly asked not to</span> <span class='diff-add'> if (options.destroy === undefined || options.destroy) {</span> <span class='diff-add'> modal.on("hidden.bs.modal", function () {</span> <span class='diff-add'> modal.remove();</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> modal.on("hidden.bs.modal", function () {</span> <span class='diff-add'> if (options.notebook) {</span> <span class='diff-add'> var cell = options.notebook.get_selected_cell();</span> <span class='diff-add'> if (cell) cell.select();</span> <span class='diff-add'> }</span> <span class='diff-add'> if (options.keyboard_manager) {</span> <span class='diff-add'> options.keyboard_manager.enable();</span> <span class='diff-add'> options.keyboard_manager.command_mode();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> if (options.keyboard_manager) {</span> <span class='diff-add'> options.keyboard_manager.disable();</span> <span class='diff-add'> }</span> <span class='diff-add'> options.backdrop = options.backdrop || 'static';</span> <span class='diff-add'> </span> <span class='diff-add'> return modal.modal(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> var kernel_modal = function (options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * only one kernel dialog should be open at a time -- but</span> <span class='diff-add'> * other modal dialogs can still be open</span> <span class='diff-add'> */</span> <span class='diff-add'> $('.kernel-modal').modal('hide');</span> <span class='diff-add'> var dialog = modal(options);</span> <span class='diff-add'> dialog.addClass('kernel-modal');</span> <span class='diff-add'> return dialog;</span> <span class='diff-add'> };</span> <span class='diff-add'> var edit_metadata = function (options) {</span> <span class='diff-add'> options.name = options.name || "Cell";</span> <span class='diff-add'> var error_div = $('<div/>').css('color', 'red');</span> <span class='diff-add'> var message = </span> <span class='diff-add'> "Manually edit the JSON below to manipulate the metadata for this " + options.name + "." +</span> <span class='diff-add'> " We recommend putting custom metadata attributes in an appropriately named sub-structure," +</span> <span class='diff-add'> " so they don't conflict with those of others.";</span> <span class='diff-add'> var textarea = $('<textarea/>')</span> <span class='diff-add'> .attr('rows', '13')</span> <span class='diff-add'> .attr('cols', '80')</span> <span class='diff-add'> .attr('name', 'metadata')</span> <span class='diff-add'> .text(JSON.stringify(options.md || {}, null, 2));</span> <span class='diff-add'> </span> <span class='diff-add'> var dialogform = $('<div/>').attr('title', 'Edit the metadata')</span> <span class='diff-add'> .append(</span> <span class='diff-add'> $('<form/>').append(</span> <span class='diff-add'> $('<fieldset/>').append(</span> <span class='diff-add'> $('<label/>')</span> <span class='diff-add'> .attr('for','metadata')</span> <span class='diff-add'> .text(message)</span> <span class='diff-add'> )</span> <span class='diff-add'> .append(error_div)</span> <span class='diff-add'> .append($('<br/>'))</span> <span class='diff-add'> .append(textarea)</span> <span class='diff-add'> )</span> <span class='diff-add'> );</span> <span class='diff-add'> var editor = CodeMirror.fromTextArea(textarea[0], {</span> <span class='diff-add'> lineNumbers: true,</span> <span class='diff-add'> matchBrackets: true,</span> <span class='diff-add'> indentUnit: 2,</span> <span class='diff-add'> autoIndent: true,</span> <span class='diff-add'> mode: 'application/json',</span> <span class='diff-add'> });</span> <span class='diff-add'> var modal_obj = modal({</span> <span class='diff-add'> title: "Edit " + options.name + " Metadata",</span> <span class='diff-add'> body: dialogform,</span> <span class='diff-add'> buttons: {</span> <span class='diff-add'> OK: { class : "btn-primary",</span> <span class='diff-add'> click: function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * validate json and set it</span> <span class='diff-add'> */</span> <span class='diff-add'> var new_md;</span> <span class='diff-add'> try {</span> <span class='diff-add'> new_md = JSON.parse(editor.getValue());</span> <span class='diff-add'> } catch(e) {</span> <span class='diff-add'> console.log(e);</span> <span class='diff-add'> error_div.text('WARNING: Could not save invalid JSON.');</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> options.callback(new_md);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> Cancel: {}</span> <span class='diff-add'> },</span> <span class='diff-add'> notebook: options.notebook,</span> <span class='diff-add'> keyboard_manager: options.keyboard_manager,</span> <span class='diff-add'> });</span> <span class='diff-add'> modal_obj.on('shown.bs.modal', function(){ editor.refresh(); });</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var dialog = {</span> <span class='diff-add'> modal : modal,</span> <span class='diff-add'> kernel_modal : kernel_modal,</span> <span class='diff-add'> edit_metadata : edit_metadata,</span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatability.</span> <span class='diff-add'> IPython.dialog = dialog;</span> <span class='diff-add'> return dialog;</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/encoding.js b/ipynb/Array-feature-overlap-05_files/encoding.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..5e99861</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/encoding.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// If we're in node require encoding-indexes and attach it to the global.</span> <span class='diff-add'>if (typeof module !== "undefined" && module.exports) {</span> <span class='diff-add'> this["encoding-indexes"] = require("./encoding-indexes.js")["encoding-indexes"];</span> <span class='diff-add'>}</span> <span class='diff-add'>(function(global) {</span> <span class='diff-add'> 'use strict';</span> <span class='diff-add'> //</span> <span class='diff-add'> // Utilities</span> <span class='diff-add'> //</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {number} a The number to test.</span> <span class='diff-add'> * @param {number} min The minimum value in the range, inclusive.</span> <span class='diff-add'> * @param {number} max The maximum value in the range, inclusive.</span> <span class='diff-add'> * @return {boolean} True if a >= min and a <= max.</span> <span class='diff-add'> */</span> <span class='diff-add'> function inRange(a, min, max) {</span> <span class='diff-add'> return min <= a && a <= max;</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {number} n The numerator.</span> <span class='diff-add'> * @param {number} d The denominator.</span> <span class='diff-add'> * @return {number} The result of the integer division of n by d.</span> <span class='diff-add'> */</span> <span class='diff-add'> function div(n, d) {</span> <span class='diff-add'> return Math.floor(n / d);</span> <span class='diff-add'> }</span> <span class='diff-add'> //</span> <span class='diff-add'> // Implementation of Encoding specification</span> <span class='diff-add'> // http://dvcs.w3.org/hg/encoding/raw-file/tip/Overview.html</span> <span class='diff-add'> //</span> <span class='diff-add'> //</span> <span class='diff-add'> // 3. Terminology</span> <span class='diff-add'> //</span> <span class='diff-add'> //</span> <span class='diff-add'> // 4. Encodings</span> <span class='diff-add'> //</span> <span class='diff-add'> /** @const */ var EOF_byte = -1;</span> <span class='diff-add'> /** @const */ var EOF_code_point = -1;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {Uint8Array} bytes Array of bytes that provide the stream.</span> <span class='diff-add'> */</span> <span class='diff-add'> function ByteInputStream(bytes) {</span> <span class='diff-add'> /** @type {number} */</span> <span class='diff-add'> var pos = 0;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @this {ByteInputStream}</span> <span class='diff-add'> * @return {number} Get the next byte from the stream.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.get = function() {</span> <span class='diff-add'> return (pos >= bytes.length) ? EOF_byte : Number(bytes[pos]);</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @param {number} n Number (positive or negative) by which to</span> <span class='diff-add'> * offset the byte pointer. */</span> <span class='diff-add'> this.offset = function(n) {</span> <span class='diff-add'> pos += n;</span> <span class='diff-add'> if (pos < 0) {</span> <span class='diff-add'> throw new Error('Seeking past start of the buffer');</span> <span class='diff-add'> }</span> <span class='diff-add'> if (pos > bytes.length) {</span> <span class='diff-add'> throw new Error('Seeking past EOF');</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {Array.<number>} test Array of bytes to compare against.</span> <span class='diff-add'> * @return {boolean} True if the start of the stream matches the test</span> <span class='diff-add'> * bytes.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.match = function(test) {</span> <span class='diff-add'> if (test.length > pos + bytes.length) {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> var i;</span> <span class='diff-add'> for (i = 0; i < test.length; i += 1) {</span> <span class='diff-add'> if (Number(bytes[pos + i]) !== test[i]) {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return true;</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {Array.<number>} bytes The array to write bytes into.</span> <span class='diff-add'> */</span> <span class='diff-add'> function ByteOutputStream(bytes) {</span> <span class='diff-add'> /** @type {number} */</span> <span class='diff-add'> var pos = 0;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {...number} var_args The byte or bytes to emit into the stream.</span> <span class='diff-add'> * @return {number} The last byte emitted.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.emit = function(var_args) {</span> <span class='diff-add'> /** @type {number} */</span> <span class='diff-add'> var last = EOF_byte;</span> <span class='diff-add'> var i;</span> <span class='diff-add'> for (i = 0; i < arguments.length; ++i) {</span> <span class='diff-add'> last = Number(arguments[i]);</span> <span class='diff-add'> bytes[pos++] = last;</span> <span class='diff-add'> }</span> <span class='diff-add'> return last;</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {string} string The source of code units for the stream.</span> <span class='diff-add'> */</span> <span class='diff-add'> function CodePointInputStream(string) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {string} string Input string of UTF-16 code units.</span> <span class='diff-add'> * @return {Array.<number>} Code points.</span> <span class='diff-add'> */</span> <span class='diff-add'> function stringToCodePoints(string) {</span> <span class='diff-add'> /** @type {Array.<number>} */</span> <span class='diff-add'> var cps = [];</span> <span class='diff-add'> // Based on http://www.w3.org/TR/WebIDL/#idl-DOMString</span> <span class='diff-add'> var i = 0, n = string.length;</span> <span class='diff-add'> while (i < string.length) {</span> <span class='diff-add'> var c = string.charCodeAt(i);</span> <span class='diff-add'> if (!inRange(c, 0xD800, 0xDFFF)) {</span> <span class='diff-add'> cps.push(c);</span> <span class='diff-add'> } else if (inRange(c, 0xDC00, 0xDFFF)) {</span> <span class='diff-add'> cps.push(0xFFFD);</span> <span class='diff-add'> } else { // (inRange(cu, 0xD800, 0xDBFF))</span> <span class='diff-add'> if (i === n - 1) {</span> <span class='diff-add'> cps.push(0xFFFD);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var d = string.charCodeAt(i + 1);</span> <span class='diff-add'> if (inRange(d, 0xDC00, 0xDFFF)) {</span> <span class='diff-add'> var a = c & 0x3FF;</span> <span class='diff-add'> var b = d & 0x3FF;</span> <span class='diff-add'> i += 1;</span> <span class='diff-add'> cps.push(0x10000 + (a << 10) + b);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> cps.push(0xFFFD);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> i += 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> return cps;</span> <span class='diff-add'> }</span> <span class='diff-add'> /** @type {number} */</span> <span class='diff-add'> var pos = 0;</span> <span class='diff-add'> /** @type {Array.<number>} */</span> <span class='diff-add'> var cps = stringToCodePoints(string);</span> <span class='diff-add'> /** @param {number} n The number of bytes (positive or negative)</span> <span class='diff-add'> * to advance the code point pointer by.*/</span> <span class='diff-add'> this.offset = function(n) {</span> <span class='diff-add'> pos += n;</span> <span class='diff-add'> if (pos < 0) {</span> <span class='diff-add'> throw new Error('Seeking past start of the buffer');</span> <span class='diff-add'> }</span> <span class='diff-add'> if (pos > cps.length) {</span> <span class='diff-add'> throw new Error('Seeking past EOF');</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @return {number} Get the next code point from the stream. */</span> <span class='diff-add'> this.get = function() {</span> <span class='diff-add'> if (pos >= cps.length) {</span> <span class='diff-add'> return EOF_code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> return cps[pos];</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> */</span> <span class='diff-add'> function CodePointOutputStream() {</span> <span class='diff-add'> /** @type {string} */</span> <span class='diff-add'> var string = '';</span> <span class='diff-add'> /** @return {string} The accumulated string. */</span> <span class='diff-add'> this.string = function() {</span> <span class='diff-add'> return string;</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @param {number} c The code point to encode into the stream. */</span> <span class='diff-add'> this.emit = function(c) {</span> <span class='diff-add'> if (c <= 0xFFFF) {</span> <span class='diff-add'> string += String.fromCharCode(c);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> c -= 0x10000;</span> <span class='diff-add'> string += String.fromCharCode(0xD800 + ((c >> 10) & 0x3ff));</span> <span class='diff-add'> string += String.fromCharCode(0xDC00 + (c & 0x3ff));</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {string} message Description of the error.</span> <span class='diff-add'> */</span> <span class='diff-add'> function EncodingError(message) {</span> <span class='diff-add'> this.name = 'EncodingError';</span> <span class='diff-add'> this.message = message;</span> <span class='diff-add'> this.code = 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> EncodingError.prototype = Error.prototype;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {boolean} fatal If true, decoding errors raise an exception.</span> <span class='diff-add'> * @param {number=} opt_code_point Override the standard fallback code point.</span> <span class='diff-add'> * @return {number} The code point to insert on a decoding error.</span> <span class='diff-add'> */</span> <span class='diff-add'> function decoderError(fatal, opt_code_point) {</span> <span class='diff-add'> if (fatal) {</span> <span class='diff-add'> throw new EncodingError('Decoder error');</span> <span class='diff-add'> }</span> <span class='diff-add'> return opt_code_point || 0xFFFD;</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {number} code_point The code point that could not be encoded.</span> <span class='diff-add'> * @return {number} Always throws, no value is actually returned.</span> <span class='diff-add'> */</span> <span class='diff-add'> function encoderError(code_point) {</span> <span class='diff-add'> throw new EncodingError('The code point ' + code_point +</span> <span class='diff-add'> ' could not be encoded.');</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {string} label The encoding label.</span> <span class='diff-add'> * @return {?{name:string,labels:Array.<string>}}</span> <span class='diff-add'> */</span> <span class='diff-add'> function getEncoding(label) {</span> <span class='diff-add'> label = String(label).trim().toLowerCase();</span> <span class='diff-add'> if (Object.prototype.hasOwnProperty.call(label_to_encoding, label)) {</span> <span class='diff-add'> return label_to_encoding[label];</span> <span class='diff-add'> }</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> /** @type {Array.<{encodings: Array.<{name:string,labels:Array.<string>}>,</span> <span class='diff-add'> * heading: string}>} */</span> <span class='diff-add'> var encodings = [</span> <span class='diff-add'> {</span> <span class='diff-add'> "encodings": [</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "unicode-1-1-utf-8",</span> <span class='diff-add'> "utf-8",</span> <span class='diff-add'> "utf8"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "utf-8"</span> <span class='diff-add'> }</span> <span class='diff-add'> ],</span> <span class='diff-add'> "heading": "The Encoding"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "encodings": [</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "866",</span> <span class='diff-add'> "cp866",</span> <span class='diff-add'> "csibm866",</span> <span class='diff-add'> "ibm866"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "ibm866"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "csisolatin2",</span> <span class='diff-add'> "iso-8859-2",</span> <span class='diff-add'> "iso-ir-101",</span> <span class='diff-add'> "iso8859-2",</span> <span class='diff-add'> "iso88592",</span> <span class='diff-add'> "iso_8859-2",</span> <span class='diff-add'> "iso_8859-2:1987",</span> <span class='diff-add'> "l2",</span> <span class='diff-add'> "latin2"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "iso-8859-2"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "csisolatin3",</span> <span class='diff-add'> "iso-8859-3",</span> <span class='diff-add'> "iso-ir-109",</span> <span class='diff-add'> "iso8859-3",</span> <span class='diff-add'> "iso88593",</span> <span class='diff-add'> "iso_8859-3",</span> <span class='diff-add'> "iso_8859-3:1988",</span> <span class='diff-add'> "l3",</span> <span class='diff-add'> "latin3"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "iso-8859-3"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "csisolatin4",</span> <span class='diff-add'> "iso-8859-4",</span> <span class='diff-add'> "iso-ir-110",</span> <span class='diff-add'> "iso8859-4",</span> <span class='diff-add'> "iso88594",</span> <span class='diff-add'> "iso_8859-4",</span> <span class='diff-add'> "iso_8859-4:1988",</span> <span class='diff-add'> "l4",</span> <span class='diff-add'> "latin4"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "iso-8859-4"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "csisolatincyrillic",</span> <span class='diff-add'> "cyrillic",</span> <span class='diff-add'> "iso-8859-5",</span> <span class='diff-add'> "iso-ir-144",</span> <span class='diff-add'> "iso8859-5",</span> <span class='diff-add'> "iso88595",</span> <span class='diff-add'> "iso_8859-5",</span> <span class='diff-add'> "iso_8859-5:1988"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "iso-8859-5"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "arabic",</span> <span class='diff-add'> "asmo-708",</span> <span class='diff-add'> "csiso88596e",</span> <span class='diff-add'> "csiso88596i",</span> <span class='diff-add'> "csisolatinarabic",</span> <span class='diff-add'> "ecma-114",</span> <span class='diff-add'> "iso-8859-6",</span> <span class='diff-add'> "iso-8859-6-e",</span> <span class='diff-add'> "iso-8859-6-i",</span> <span class='diff-add'> "iso-ir-127",</span> <span class='diff-add'> "iso8859-6",</span> <span class='diff-add'> "iso88596",</span> <span class='diff-add'> "iso_8859-6",</span> <span class='diff-add'> "iso_8859-6:1987"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "iso-8859-6"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "csisolatingreek",</span> <span class='diff-add'> "ecma-118",</span> <span class='diff-add'> "elot_928",</span> <span class='diff-add'> "greek",</span> <span class='diff-add'> "greek8",</span> <span class='diff-add'> "iso-8859-7",</span> <span class='diff-add'> "iso-ir-126",</span> <span class='diff-add'> "iso8859-7",</span> <span class='diff-add'> "iso88597",</span> <span class='diff-add'> "iso_8859-7",</span> <span class='diff-add'> "iso_8859-7:1987",</span> <span class='diff-add'> "sun_eu_greek"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "iso-8859-7"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "csiso88598e",</span> <span class='diff-add'> "csisolatinhebrew",</span> <span class='diff-add'> "hebrew",</span> <span class='diff-add'> "iso-8859-8",</span> <span class='diff-add'> "iso-8859-8-e",</span> <span class='diff-add'> "iso-ir-138",</span> <span class='diff-add'> "iso8859-8",</span> <span class='diff-add'> "iso88598",</span> <span class='diff-add'> "iso_8859-8",</span> <span class='diff-add'> "iso_8859-8:1988",</span> <span class='diff-add'> "visual"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "iso-8859-8"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "csiso88598i",</span> <span class='diff-add'> "iso-8859-8-i",</span> <span class='diff-add'> "logical"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "iso-8859-8-i"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "csisolatin6",</span> <span class='diff-add'> "iso-8859-10",</span> <span class='diff-add'> "iso-ir-157",</span> <span class='diff-add'> "iso8859-10",</span> <span class='diff-add'> "iso885910",</span> <span class='diff-add'> "l6",</span> <span class='diff-add'> "latin6"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "iso-8859-10"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "iso-8859-13",</span> <span class='diff-add'> "iso8859-13",</span> <span class='diff-add'> "iso885913"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "iso-8859-13"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "iso-8859-14",</span> <span class='diff-add'> "iso8859-14",</span> <span class='diff-add'> "iso885914"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "iso-8859-14"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "csisolatin9",</span> <span class='diff-add'> "iso-8859-15",</span> <span class='diff-add'> "iso8859-15",</span> <span class='diff-add'> "iso885915",</span> <span class='diff-add'> "iso_8859-15",</span> <span class='diff-add'> "l9"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "iso-8859-15"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "iso-8859-16"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "iso-8859-16"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "cskoi8r",</span> <span class='diff-add'> "koi",</span> <span class='diff-add'> "koi8",</span> <span class='diff-add'> "koi8-r",</span> <span class='diff-add'> "koi8_r"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "koi8-r"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "koi8-u"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "koi8-u"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "csmacintosh",</span> <span class='diff-add'> "mac",</span> <span class='diff-add'> "macintosh",</span> <span class='diff-add'> "x-mac-roman"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "macintosh"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "dos-874",</span> <span class='diff-add'> "iso-8859-11",</span> <span class='diff-add'> "iso8859-11",</span> <span class='diff-add'> "iso885911",</span> <span class='diff-add'> "tis-620",</span> <span class='diff-add'> "windows-874"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "windows-874"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "cp1250",</span> <span class='diff-add'> "windows-1250",</span> <span class='diff-add'> "x-cp1250"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "windows-1250"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "cp1251",</span> <span class='diff-add'> "windows-1251",</span> <span class='diff-add'> "x-cp1251"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "windows-1251"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "ansi_x3.4-1968",</span> <span class='diff-add'> "ascii",</span> <span class='diff-add'> "cp1252",</span> <span class='diff-add'> "cp819",</span> <span class='diff-add'> "csisolatin1",</span> <span class='diff-add'> "ibm819",</span> <span class='diff-add'> "iso-8859-1",</span> <span class='diff-add'> "iso-ir-100",</span> <span class='diff-add'> "iso8859-1",</span> <span class='diff-add'> "iso88591",</span> <span class='diff-add'> "iso_8859-1",</span> <span class='diff-add'> "iso_8859-1:1987",</span> <span class='diff-add'> "l1",</span> <span class='diff-add'> "latin1",</span> <span class='diff-add'> "us-ascii",</span> <span class='diff-add'> "windows-1252",</span> <span class='diff-add'> "x-cp1252"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "windows-1252"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "cp1253",</span> <span class='diff-add'> "windows-1253",</span> <span class='diff-add'> "x-cp1253"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "windows-1253"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "cp1254",</span> <span class='diff-add'> "csisolatin5",</span> <span class='diff-add'> "iso-8859-9",</span> <span class='diff-add'> "iso-ir-148",</span> <span class='diff-add'> "iso8859-9",</span> <span class='diff-add'> "iso88599",</span> <span class='diff-add'> "iso_8859-9",</span> <span class='diff-add'> "iso_8859-9:1989",</span> <span class='diff-add'> "l5",</span> <span class='diff-add'> "latin5",</span> <span class='diff-add'> "windows-1254",</span> <span class='diff-add'> "x-cp1254"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "windows-1254"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "cp1255",</span> <span class='diff-add'> "windows-1255",</span> <span class='diff-add'> "x-cp1255"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "windows-1255"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "cp1256",</span> <span class='diff-add'> "windows-1256",</span> <span class='diff-add'> "x-cp1256"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "windows-1256"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "cp1257",</span> <span class='diff-add'> "windows-1257",</span> <span class='diff-add'> "x-cp1257"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "windows-1257"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "cp1258",</span> <span class='diff-add'> "windows-1258",</span> <span class='diff-add'> "x-cp1258"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "windows-1258"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "x-mac-cyrillic",</span> <span class='diff-add'> "x-mac-ukrainian"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "x-mac-cyrillic"</span> <span class='diff-add'> }</span> <span class='diff-add'> ],</span> <span class='diff-add'> "heading": "Legacy single-byte encodings"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "encodings": [</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "chinese",</span> <span class='diff-add'> "csgb2312",</span> <span class='diff-add'> "csiso58gb231280",</span> <span class='diff-add'> "gb18030",</span> <span class='diff-add'> "gb2312",</span> <span class='diff-add'> "gb_2312",</span> <span class='diff-add'> "gb_2312-80",</span> <span class='diff-add'> "gbk",</span> <span class='diff-add'> "iso-ir-58",</span> <span class='diff-add'> "x-gbk"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "gb18030"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "hz-gb-2312"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "hz-gb-2312"</span> <span class='diff-add'> }</span> <span class='diff-add'> ],</span> <span class='diff-add'> "heading": "Legacy multi-byte Chinese (simplified) encodings"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "encodings": [</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "big5",</span> <span class='diff-add'> "big5-hkscs",</span> <span class='diff-add'> "cn-big5",</span> <span class='diff-add'> "csbig5",</span> <span class='diff-add'> "x-x-big5"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "big5"</span> <span class='diff-add'> }</span> <span class='diff-add'> ],</span> <span class='diff-add'> "heading": "Legacy multi-byte Chinese (traditional) encodings"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "encodings": [</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "cseucpkdfmtjapanese",</span> <span class='diff-add'> "euc-jp",</span> <span class='diff-add'> "x-euc-jp"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "euc-jp"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "csiso2022jp",</span> <span class='diff-add'> "iso-2022-jp"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "iso-2022-jp"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "csshiftjis",</span> <span class='diff-add'> "ms_kanji",</span> <span class='diff-add'> "shift-jis",</span> <span class='diff-add'> "shift_jis",</span> <span class='diff-add'> "sjis",</span> <span class='diff-add'> "windows-31j",</span> <span class='diff-add'> "x-sjis"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "shift_jis"</span> <span class='diff-add'> }</span> <span class='diff-add'> ],</span> <span class='diff-add'> "heading": "Legacy multi-byte Japanese encodings"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "encodings": [</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "cseuckr",</span> <span class='diff-add'> "csksc56011987",</span> <span class='diff-add'> "euc-kr",</span> <span class='diff-add'> "iso-ir-149",</span> <span class='diff-add'> "korean",</span> <span class='diff-add'> "ks_c_5601-1987",</span> <span class='diff-add'> "ks_c_5601-1989",</span> <span class='diff-add'> "ksc5601",</span> <span class='diff-add'> "ksc_5601",</span> <span class='diff-add'> "windows-949"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "euc-kr"</span> <span class='diff-add'> }</span> <span class='diff-add'> ],</span> <span class='diff-add'> "heading": "Legacy multi-byte Korean encodings"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "encodings": [</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "csiso2022kr",</span> <span class='diff-add'> "iso-2022-cn",</span> <span class='diff-add'> "iso-2022-cn-ext",</span> <span class='diff-add'> "iso-2022-kr"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "replacement"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "utf-16be"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "utf-16be"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "utf-16",</span> <span class='diff-add'> "utf-16le"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "utf-16le"</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "labels": [</span> <span class='diff-add'> "x-user-defined"</span> <span class='diff-add'> ],</span> <span class='diff-add'> "name": "x-user-defined"</span> <span class='diff-add'> }</span> <span class='diff-add'> ],</span> <span class='diff-add'> "heading": "Legacy miscellaneous encodings"</span> <span class='diff-add'> }</span> <span class='diff-add'> ];</span> <span class='diff-add'> var name_to_encoding = {};</span> <span class='diff-add'> var label_to_encoding = {};</span> <span class='diff-add'> encodings.forEach(function(category) {</span> <span class='diff-add'> category['encodings'].forEach(function(encoding) {</span> <span class='diff-add'> name_to_encoding[encoding['name']] = encoding;</span> <span class='diff-add'> encoding['labels'].forEach(function(label) {</span> <span class='diff-add'> label_to_encoding[label] = encoding;</span> <span class='diff-add'> });</span> <span class='diff-add'> });</span> <span class='diff-add'> });</span> <span class='diff-add'> //</span> <span class='diff-add'> // 5. Indexes</span> <span class='diff-add'> //</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {number} pointer The |pointer| to search for.</span> <span class='diff-add'> * @param {Array.<?number>|undefined} index The |index| to search within.</span> <span class='diff-add'> * @return {?number} The code point corresponding to |pointer| in |index|,</span> <span class='diff-add'> * or null if |code point| is not in |index|.</span> <span class='diff-add'> */</span> <span class='diff-add'> function indexCodePointFor(pointer, index) {</span> <span class='diff-add'> if (!index) return null;</span> <span class='diff-add'> return index[pointer] || null;</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {number} code_point The |code point| to search for.</span> <span class='diff-add'> * @param {Array.<?number>} index The |index| to search within.</span> <span class='diff-add'> * @return {?number} The first pointer corresponding to |code point| in</span> <span class='diff-add'> * |index|, or null if |code point| is not in |index|.</span> <span class='diff-add'> */</span> <span class='diff-add'> function indexPointerFor(code_point, index) {</span> <span class='diff-add'> var pointer = index.indexOf(code_point);</span> <span class='diff-add'> return pointer === -1 ? null : pointer;</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {string} name Name of the index.</span> <span class='diff-add'> * @return {(Array.<number>|Array.<Array.<number>>)}</span> <span class='diff-add'> * */</span> <span class='diff-add'> function index(name) {</span> <span class='diff-add'> if (!('encoding-indexes' in global))</span> <span class='diff-add'> throw new Error("Indexes missing. Did you forget to include encoding-indexes.js?");</span> <span class='diff-add'> return global['encoding-indexes'][name];</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {number} pointer The |pointer| to search for in the gb18030 index.</span> <span class='diff-add'> * @return {?number} The code point corresponding to |pointer| in |index|,</span> <span class='diff-add'> * or null if |code point| is not in the gb18030 index.</span> <span class='diff-add'> */</span> <span class='diff-add'> function indexGB18030CodePointFor(pointer) {</span> <span class='diff-add'> if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575)) {</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> var /** @type {number} */ offset = 0,</span> <span class='diff-add'> /** @type {number} */ code_point_offset = 0,</span> <span class='diff-add'> /** @type {Array.<Array.<number>>} */ idx = index('gb18030');</span> <span class='diff-add'> var i;</span> <span class='diff-add'> for (i = 0; i < idx.length; ++i) {</span> <span class='diff-add'> var entry = idx[i];</span> <span class='diff-add'> if (entry[0] <= pointer) {</span> <span class='diff-add'> offset = entry[0];</span> <span class='diff-add'> code_point_offset = entry[1];</span> <span class='diff-add'> } else {</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return code_point_offset + pointer - offset;</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {number} code_point The |code point| to locate in the gb18030 index.</span> <span class='diff-add'> * @return {number} The first pointer corresponding to |code point| in the</span> <span class='diff-add'> * gb18030 index.</span> <span class='diff-add'> */</span> <span class='diff-add'> function indexGB18030PointerFor(code_point) {</span> <span class='diff-add'> var /** @type {number} */ offset = 0,</span> <span class='diff-add'> /** @type {number} */ pointer_offset = 0,</span> <span class='diff-add'> /** @type {Array.<Array.<number>>} */ idx = index('gb18030');</span> <span class='diff-add'> var i;</span> <span class='diff-add'> for (i = 0; i < idx.length; ++i) {</span> <span class='diff-add'> var entry = idx[i];</span> <span class='diff-add'> if (entry[1] <= code_point) {</span> <span class='diff-add'> offset = entry[1];</span> <span class='diff-add'> pointer_offset = entry[0];</span> <span class='diff-add'> } else {</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return pointer_offset + code_point - offset;</span> <span class='diff-add'> }</span> <span class='diff-add'> //</span> <span class='diff-add'> // 7. API</span> <span class='diff-add'> //</span> <span class='diff-add'> /** @const */ var DEFAULT_ENCODING = 'utf-8';</span> <span class='diff-add'> // 7.1 Interface TextDecoder</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {string=} opt_encoding The label of the encoding;</span> <span class='diff-add'> * defaults to 'utf-8'.</span> <span class='diff-add'> * @param {{fatal: boolean}=} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function TextDecoder(opt_encoding, options) {</span> <span class='diff-add'> if (!(this instanceof TextDecoder)) {</span> <span class='diff-add'> return new TextDecoder(opt_encoding, options);</span> <span class='diff-add'> }</span> <span class='diff-add'> opt_encoding = opt_encoding ? String(opt_encoding) : DEFAULT_ENCODING;</span> <span class='diff-add'> options = Object(options);</span> <span class='diff-add'> /** @private */</span> <span class='diff-add'> this._encoding = getEncoding(opt_encoding);</span> <span class='diff-add'> if (this._encoding === null || this._encoding.name === 'replacement')</span> <span class='diff-add'> throw new TypeError('Unknown encoding: ' + opt_encoding);</span> <span class='diff-add'> if (!this._encoding.getDecoder)</span> <span class='diff-add'> throw new Error('Decoder not present. Did you forget to include encoding-indexes.js?');</span> <span class='diff-add'> /** @private @type {boolean} */</span> <span class='diff-add'> this._streaming = false;</span> <span class='diff-add'> /** @private @type {boolean} */</span> <span class='diff-add'> this._BOMseen = false;</span> <span class='diff-add'> /** @private */</span> <span class='diff-add'> this._decoder = null;</span> <span class='diff-add'> /** @private @type {{fatal: boolean}=} */</span> <span class='diff-add'> this._options = { fatal: Boolean(options.fatal) };</span> <span class='diff-add'> if (Object.defineProperty) {</span> <span class='diff-add'> Object.defineProperty(</span> <span class='diff-add'> this, 'encoding',</span> <span class='diff-add'> { get: function() { return this._encoding.name; } });</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.encoding = this._encoding.name;</span> <span class='diff-add'> }</span> <span class='diff-add'> return this;</span> <span class='diff-add'> }</span> <span class='diff-add'> // TODO: Issue if input byte stream is offset by decoder</span> <span class='diff-add'> // TODO: BOM detection will not work if stream header spans multiple calls</span> <span class='diff-add'> // (last N bytes of previous stream may need to be retained?)</span> <span class='diff-add'> TextDecoder.prototype = {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ArrayBufferView=} opt_view The buffer of bytes to decode.</span> <span class='diff-add'> * @param {{stream: boolean}=} options</span> <span class='diff-add'> */</span> <span class='diff-add'> decode: function decode(opt_view, options) {</span> <span class='diff-add'> if (opt_view && !('buffer' in opt_view && 'byteOffset' in opt_view &&</span> <span class='diff-add'> 'byteLength' in opt_view)) {</span> <span class='diff-add'> throw new TypeError('Expected ArrayBufferView');</span> <span class='diff-add'> } else if (!opt_view) {</span> <span class='diff-add'> opt_view = new Uint8Array(0);</span> <span class='diff-add'> }</span> <span class='diff-add'> options = Object(options);</span> <span class='diff-add'> if (!this._streaming) {</span> <span class='diff-add'> this._decoder = this._encoding.getDecoder(this._options);</span> <span class='diff-add'> this._BOMseen = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> this._streaming = Boolean(options.stream);</span> <span class='diff-add'> var bytes = new Uint8Array(opt_view.buffer,</span> <span class='diff-add'> opt_view.byteOffset,</span> <span class='diff-add'> opt_view.byteLength);</span> <span class='diff-add'> var input_stream = new ByteInputStream(bytes);</span> <span class='diff-add'> var output_stream = new CodePointOutputStream();</span> <span class='diff-add'> /** @type {number} */</span> <span class='diff-add'> var code_point;</span> <span class='diff-add'> while (input_stream.get() !== EOF_byte) {</span> <span class='diff-add'> code_point = this._decoder.decode(input_stream);</span> <span class='diff-add'> if (code_point !== null && code_point !== EOF_code_point) {</span> <span class='diff-add'> output_stream.emit(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!this._streaming) {</span> <span class='diff-add'> do {</span> <span class='diff-add'> code_point = this._decoder.decode(input_stream);</span> <span class='diff-add'> if (code_point !== null && code_point !== EOF_code_point) {</span> <span class='diff-add'> output_stream.emit(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> } while (code_point !== EOF_code_point &&</span> <span class='diff-add'> input_stream.get() != EOF_byte);</span> <span class='diff-add'> this._decoder = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> var result = output_stream.string();</span> <span class='diff-add'> if (!this._BOMseen && result.length) {</span> <span class='diff-add'> this._BOMseen = true;</span> <span class='diff-add'> if (['utf-8', 'utf-16le', 'utf-16be'].indexOf(this.encoding) !== -1 &&</span> <span class='diff-add'> result.charCodeAt(0) === 0xFEFF) {</span> <span class='diff-add'> result = result.substring(1);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return result;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // 7.2 Interface TextEncoder</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {string=} opt_encoding The label of the encoding;</span> <span class='diff-add'> * defaults to 'utf-8'.</span> <span class='diff-add'> * @param {{fatal: boolean}=} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function TextEncoder(opt_encoding, options) {</span> <span class='diff-add'> if (!(this instanceof TextEncoder)) {</span> <span class='diff-add'> return new TextEncoder(opt_encoding, options);</span> <span class='diff-add'> }</span> <span class='diff-add'> opt_encoding = opt_encoding ? String(opt_encoding) : DEFAULT_ENCODING;</span> <span class='diff-add'> options = Object(options);</span> <span class='diff-add'> /** @private */</span> <span class='diff-add'> this._encoding = getEncoding(opt_encoding);</span> <span class='diff-add'> var allowLegacyEncoding = options.NONSTANDARD_allowLegacyEncoding;</span> <span class='diff-add'> var isLegacyEncoding = (this._encoding.name !== 'utf-8' &&</span> <span class='diff-add'> this._encoding.name !== 'utf-16le' &&</span> <span class='diff-add'> this._encoding.name !== 'utf-16be');</span> <span class='diff-add'> if (this._encoding === null || (isLegacyEncoding && !allowLegacyEncoding))</span> <span class='diff-add'> throw new TypeError('Unknown encoding: ' + opt_encoding);</span> <span class='diff-add'> if (!this._encoding.getEncoder)</span> <span class='diff-add'> throw new Error('Encoder not present. Did you forget to include encoding-indexes.js?');</span> <span class='diff-add'> /** @private @type {boolean} */</span> <span class='diff-add'> this._streaming = false;</span> <span class='diff-add'> /** @private */</span> <span class='diff-add'> this._encoder = null;</span> <span class='diff-add'> /** @private @type {{fatal: boolean}=} */</span> <span class='diff-add'> this._options = { fatal: Boolean(options.fatal) };</span> <span class='diff-add'> if (Object.defineProperty) {</span> <span class='diff-add'> Object.defineProperty(</span> <span class='diff-add'> this, 'encoding',</span> <span class='diff-add'> { get: function() { return this._encoding.name; } });</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.encoding = this._encoding.name;</span> <span class='diff-add'> }</span> <span class='diff-add'> return this;</span> <span class='diff-add'> }</span> <span class='diff-add'> TextEncoder.prototype = {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {string=} opt_string The string to encode.</span> <span class='diff-add'> * @param {{stream: boolean}=} options</span> <span class='diff-add'> */</span> <span class='diff-add'> encode: function encode(opt_string, options) {</span> <span class='diff-add'> opt_string = opt_string ? String(opt_string) : '';</span> <span class='diff-add'> options = Object(options);</span> <span class='diff-add'> // TODO: any options?</span> <span class='diff-add'> if (!this._streaming) {</span> <span class='diff-add'> this._encoder = this._encoding.getEncoder(this._options);</span> <span class='diff-add'> }</span> <span class='diff-add'> this._streaming = Boolean(options.stream);</span> <span class='diff-add'> var bytes = [];</span> <span class='diff-add'> var output_stream = new ByteOutputStream(bytes);</span> <span class='diff-add'> var input_stream = new CodePointInputStream(opt_string);</span> <span class='diff-add'> while (input_stream.get() !== EOF_code_point) {</span> <span class='diff-add'> this._encoder.encode(output_stream, input_stream);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!this._streaming) {</span> <span class='diff-add'> /** @type {number} */</span> <span class='diff-add'> var last_byte;</span> <span class='diff-add'> do {</span> <span class='diff-add'> last_byte = this._encoder.encode(output_stream, input_stream);</span> <span class='diff-add'> } while (last_byte !== EOF_byte);</span> <span class='diff-add'> this._encoder = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> return new Uint8Array(bytes);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> //</span> <span class='diff-add'> // 8. The encoding</span> <span class='diff-add'> //</span> <span class='diff-add'> // 8.1 utf-8</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function UTF8Decoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> var /** @type {number} */ utf8_code_point = 0,</span> <span class='diff-add'> /** @type {number} */ utf8_bytes_needed = 0,</span> <span class='diff-add'> /** @type {number} */ utf8_bytes_seen = 0,</span> <span class='diff-add'> /** @type {number} */ utf8_lower_boundary = 0;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span> <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span> <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.decode = function(byte_pointer) {</span> <span class='diff-add'> var bite = byte_pointer.get();</span> <span class='diff-add'> if (bite === EOF_byte) {</span> <span class='diff-add'> if (utf8_bytes_needed !== 0) {</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> return EOF_code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> byte_pointer.offset(1);</span> <span class='diff-add'> if (utf8_bytes_needed === 0) {</span> <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span> <span class='diff-add'> return bite;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(bite, 0xC2, 0xDF)) {</span> <span class='diff-add'> utf8_bytes_needed = 1;</span> <span class='diff-add'> utf8_lower_boundary = 0x80;</span> <span class='diff-add'> utf8_code_point = bite - 0xC0;</span> <span class='diff-add'> } else if (inRange(bite, 0xE0, 0xEF)) {</span> <span class='diff-add'> utf8_bytes_needed = 2;</span> <span class='diff-add'> utf8_lower_boundary = 0x800;</span> <span class='diff-add'> utf8_code_point = bite - 0xE0;</span> <span class='diff-add'> } else if (inRange(bite, 0xF0, 0xF4)) {</span> <span class='diff-add'> utf8_bytes_needed = 3;</span> <span class='diff-add'> utf8_lower_boundary = 0x10000;</span> <span class='diff-add'> utf8_code_point = bite - 0xF0;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> utf8_code_point = utf8_code_point * Math.pow(64, utf8_bytes_needed);</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!inRange(bite, 0x80, 0xBF)) {</span> <span class='diff-add'> utf8_code_point = 0;</span> <span class='diff-add'> utf8_bytes_needed = 0;</span> <span class='diff-add'> utf8_bytes_seen = 0;</span> <span class='diff-add'> utf8_lower_boundary = 0;</span> <span class='diff-add'> byte_pointer.offset(-1);</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> utf8_bytes_seen += 1;</span> <span class='diff-add'> utf8_code_point = utf8_code_point + (bite - 0x80) *</span> <span class='diff-add'> Math.pow(64, utf8_bytes_needed - utf8_bytes_seen);</span> <span class='diff-add'> if (utf8_bytes_seen !== utf8_bytes_needed) {</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> var code_point = utf8_code_point;</span> <span class='diff-add'> var lower_boundary = utf8_lower_boundary;</span> <span class='diff-add'> utf8_code_point = 0;</span> <span class='diff-add'> utf8_bytes_needed = 0;</span> <span class='diff-add'> utf8_bytes_seen = 0;</span> <span class='diff-add'> utf8_lower_boundary = 0;</span> <span class='diff-add'> if (inRange(code_point, lower_boundary, 0x10FFFF) &&</span> <span class='diff-add'> !inRange(code_point, 0xD800, 0xDFFF)) {</span> <span class='diff-add'> return code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function UTF8Encoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span> <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span> <span class='diff-add'> * @return {number} The last byte emitted.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span> <span class='diff-add'> /** @type {number} */</span> <span class='diff-add'> var code_point = code_point_pointer.get();</span> <span class='diff-add'> if (code_point === EOF_code_point) {</span> <span class='diff-add'> return EOF_byte;</span> <span class='diff-add'> }</span> <span class='diff-add'> code_point_pointer.offset(1);</span> <span class='diff-add'> if (inRange(code_point, 0xD800, 0xDFFF)) {</span> <span class='diff-add'> return encoderError(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007f)) {</span> <span class='diff-add'> return output_byte_stream.emit(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> var count, offset;</span> <span class='diff-add'> if (inRange(code_point, 0x0080, 0x07FF)) {</span> <span class='diff-add'> count = 1;</span> <span class='diff-add'> offset = 0xC0;</span> <span class='diff-add'> } else if (inRange(code_point, 0x0800, 0xFFFF)) {</span> <span class='diff-add'> count = 2;</span> <span class='diff-add'> offset = 0xE0;</span> <span class='diff-add'> } else if (inRange(code_point, 0x10000, 0x10FFFF)) {</span> <span class='diff-add'> count = 3;</span> <span class='diff-add'> offset = 0xF0;</span> <span class='diff-add'> }</span> <span class='diff-add'> var result = output_byte_stream.emit(</span> <span class='diff-add'> div(code_point, Math.pow(64, count)) + offset);</span> <span class='diff-add'> while (count > 0) {</span> <span class='diff-add'> var temp = div(code_point, Math.pow(64, count - 1));</span> <span class='diff-add'> result = output_byte_stream.emit(0x80 + (temp % 64));</span> <span class='diff-add'> count -= 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> return result;</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['utf-8'].getEncoder = function(options) {</span> <span class='diff-add'> return new UTF8Encoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['utf-8'].getDecoder = function(options) {</span> <span class='diff-add'> return new UTF8Decoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> //</span> <span class='diff-add'> // 9. Legacy single-byte encodings</span> <span class='diff-add'> //</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {Array.<number>} index The encoding index.</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function SingleByteDecoder(index, options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span> <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span> <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.decode = function(byte_pointer) {</span> <span class='diff-add'> var bite = byte_pointer.get();</span> <span class='diff-add'> if (bite === EOF_byte) {</span> <span class='diff-add'> return EOF_code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> byte_pointer.offset(1);</span> <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span> <span class='diff-add'> return bite;</span> <span class='diff-add'> }</span> <span class='diff-add'> var code_point = index[bite - 0x80];</span> <span class='diff-add'> if (code_point === null) {</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> return code_point;</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {Array.<?number>} index The encoding index.</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function SingleByteEncoder(index, options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span> <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span> <span class='diff-add'> * @return {number} The last byte emitted.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span> <span class='diff-add'> var code_point = code_point_pointer.get();</span> <span class='diff-add'> if (code_point === EOF_code_point) {</span> <span class='diff-add'> return EOF_byte;</span> <span class='diff-add'> }</span> <span class='diff-add'> code_point_pointer.offset(1);</span> <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span> <span class='diff-add'> return output_byte_stream.emit(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> var pointer = indexPointerFor(code_point, index);</span> <span class='diff-add'> if (pointer === null) {</span> <span class='diff-add'> encoderError(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> return output_byte_stream.emit(pointer + 0x80);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> (function() {</span> <span class='diff-add'> if (!('encoding-indexes' in global))</span> <span class='diff-add'> return;</span> <span class='diff-add'> encodings.forEach(function(category) {</span> <span class='diff-add'> if (category['heading'] !== 'Legacy single-byte encodings')</span> <span class='diff-add'> return;</span> <span class='diff-add'> category['encodings'].forEach(function(encoding) {</span> <span class='diff-add'> var idx = index(encoding['name']);</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> encoding.getDecoder = function(options) {</span> <span class='diff-add'> return new SingleByteDecoder(idx, options);</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> encoding.getEncoder = function(options) {</span> <span class='diff-add'> return new SingleByteEncoder(idx, options);</span> <span class='diff-add'> };</span> <span class='diff-add'> });</span> <span class='diff-add'> });</span> <span class='diff-add'> }());</span> <span class='diff-add'> //</span> <span class='diff-add'> // 10. Legacy multi-byte Chinese (simplified) encodings</span> <span class='diff-add'> //</span> <span class='diff-add'> // 9.1 gb18030</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function GB18030Decoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> var /** @type {number} */ gb18030_first = 0x00,</span> <span class='diff-add'> /** @type {number} */ gb18030_second = 0x00,</span> <span class='diff-add'> /** @type {number} */ gb18030_third = 0x00;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span> <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span> <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.decode = function(byte_pointer) {</span> <span class='diff-add'> var bite = byte_pointer.get();</span> <span class='diff-add'> if (bite === EOF_byte && gb18030_first === 0x00 &&</span> <span class='diff-add'> gb18030_second === 0x00 && gb18030_third === 0x00) {</span> <span class='diff-add'> return EOF_code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === EOF_byte &&</span> <span class='diff-add'> (gb18030_first !== 0x00 || gb18030_second !== 0x00 || gb18030_third !== 0x00)) {</span> <span class='diff-add'> gb18030_first = 0x00;</span> <span class='diff-add'> gb18030_second = 0x00;</span> <span class='diff-add'> gb18030_third = 0x00;</span> <span class='diff-add'> decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> byte_pointer.offset(1);</span> <span class='diff-add'> var code_point;</span> <span class='diff-add'> if (gb18030_third !== 0x00) {</span> <span class='diff-add'> code_point = null;</span> <span class='diff-add'> if (inRange(bite, 0x30, 0x39)) {</span> <span class='diff-add'> code_point = indexGB18030CodePointFor(</span> <span class='diff-add'> (((gb18030_first - 0x81) * 10 + (gb18030_second - 0x30)) * 126 +</span> <span class='diff-add'> (gb18030_third - 0x81)) * 10 + bite - 0x30);</span> <span class='diff-add'> }</span> <span class='diff-add'> gb18030_first = 0x00;</span> <span class='diff-add'> gb18030_second = 0x00;</span> <span class='diff-add'> gb18030_third = 0x00;</span> <span class='diff-add'> if (code_point === null) {</span> <span class='diff-add'> byte_pointer.offset(-3);</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> return code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (gb18030_second !== 0x00) {</span> <span class='diff-add'> if (inRange(bite, 0x81, 0xFE)) {</span> <span class='diff-add'> gb18030_third = bite;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> byte_pointer.offset(-2);</span> <span class='diff-add'> gb18030_first = 0x00;</span> <span class='diff-add'> gb18030_second = 0x00;</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (gb18030_first !== 0x00) {</span> <span class='diff-add'> if (inRange(bite, 0x30, 0x39)) {</span> <span class='diff-add'> gb18030_second = bite;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> var lead = gb18030_first;</span> <span class='diff-add'> var pointer = null;</span> <span class='diff-add'> gb18030_first = 0x00;</span> <span class='diff-add'> var offset = bite < 0x7F ? 0x40 : 0x41;</span> <span class='diff-add'> if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFE)) {</span> <span class='diff-add'> pointer = (lead - 0x81) * 190 + (bite - offset);</span> <span class='diff-add'> }</span> <span class='diff-add'> code_point = pointer === null ? null :</span> <span class='diff-add'> indexCodePointFor(pointer, index('gb18030'));</span> <span class='diff-add'> if (pointer === null) {</span> <span class='diff-add'> byte_pointer.offset(-1);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code_point === null) {</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> return code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span> <span class='diff-add'> return bite;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === 0x80) {</span> <span class='diff-add'> return 0x20AC;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(bite, 0x81, 0xFE)) {</span> <span class='diff-add'> gb18030_first = bite;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function GB18030Encoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span> <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span> <span class='diff-add'> * @return {number} The last byte emitted.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span> <span class='diff-add'> var code_point = code_point_pointer.get();</span> <span class='diff-add'> if (code_point === EOF_code_point) {</span> <span class='diff-add'> return EOF_byte;</span> <span class='diff-add'> }</span> <span class='diff-add'> code_point_pointer.offset(1);</span> <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span> <span class='diff-add'> return output_byte_stream.emit(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> var pointer = indexPointerFor(code_point, index('gb18030'));</span> <span class='diff-add'> if (pointer !== null) {</span> <span class='diff-add'> var lead = div(pointer, 190) + 0x81;</span> <span class='diff-add'> var trail = pointer % 190;</span> <span class='diff-add'> var offset = trail < 0x3F ? 0x40 : 0x41;</span> <span class='diff-add'> return output_byte_stream.emit(lead, trail + offset);</span> <span class='diff-add'> }</span> <span class='diff-add'> pointer = indexGB18030PointerFor(code_point);</span> <span class='diff-add'> var byte1 = div(div(div(pointer, 10), 126), 10);</span> <span class='diff-add'> pointer = pointer - byte1 * 10 * 126 * 10;</span> <span class='diff-add'> var byte2 = div(div(pointer, 10), 126);</span> <span class='diff-add'> pointer = pointer - byte2 * 10 * 126;</span> <span class='diff-add'> var byte3 = div(pointer, 10);</span> <span class='diff-add'> var byte4 = pointer - byte3 * 10;</span> <span class='diff-add'> return output_byte_stream.emit(byte1 + 0x81,</span> <span class='diff-add'> byte2 + 0x30,</span> <span class='diff-add'> byte3 + 0x81,</span> <span class='diff-add'> byte4 + 0x30);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['gb18030'].getEncoder = function(options) {</span> <span class='diff-add'> return new GB18030Encoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['gb18030'].getDecoder = function(options) {</span> <span class='diff-add'> return new GB18030Decoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> // 10.2 hz-gb-2312</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function HZGB2312Decoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> var /** @type {boolean} */ hzgb2312 = false,</span> <span class='diff-add'> /** @type {number} */ hzgb2312_lead = 0x00;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span> <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span> <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.decode = function(byte_pointer) {</span> <span class='diff-add'> var bite = byte_pointer.get();</span> <span class='diff-add'> if (bite === EOF_byte && hzgb2312_lead === 0x00) {</span> <span class='diff-add'> return EOF_code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === EOF_byte && hzgb2312_lead !== 0x00) {</span> <span class='diff-add'> hzgb2312_lead = 0x00;</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> byte_pointer.offset(1);</span> <span class='diff-add'> if (hzgb2312_lead === 0x7E) {</span> <span class='diff-add'> hzgb2312_lead = 0x00;</span> <span class='diff-add'> if (bite === 0x7B) {</span> <span class='diff-add'> hzgb2312 = true;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === 0x7D) {</span> <span class='diff-add'> hzgb2312 = false;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === 0x7E) {</span> <span class='diff-add'> return 0x007E;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === 0x0A) {</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> byte_pointer.offset(-1);</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (hzgb2312_lead !== 0x00) {</span> <span class='diff-add'> var lead = hzgb2312_lead;</span> <span class='diff-add'> hzgb2312_lead = 0x00;</span> <span class='diff-add'> var code_point = null;</span> <span class='diff-add'> if (inRange(bite, 0x21, 0x7E)) {</span> <span class='diff-add'> code_point = indexCodePointFor((lead - 1) * 190 +</span> <span class='diff-add'> (bite + 0x3F), index('gb18030'));</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === 0x0A) {</span> <span class='diff-add'> hzgb2312 = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code_point === null) {</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> return code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === 0x7E) {</span> <span class='diff-add'> hzgb2312_lead = 0x7E;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (hzgb2312) {</span> <span class='diff-add'> if (inRange(bite, 0x20, 0x7F)) {</span> <span class='diff-add'> hzgb2312_lead = bite;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === 0x0A) {</span> <span class='diff-add'> hzgb2312 = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span> <span class='diff-add'> return bite;</span> <span class='diff-add'> }</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function HZGB2312Encoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> /** @type {boolean} */</span> <span class='diff-add'> var hzgb2312 = false;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span> <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span> <span class='diff-add'> * @return {number} The last byte emitted.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span> <span class='diff-add'> var code_point = code_point_pointer.get();</span> <span class='diff-add'> if (code_point === EOF_code_point) {</span> <span class='diff-add'> return EOF_byte;</span> <span class='diff-add'> }</span> <span class='diff-add'> code_point_pointer.offset(1);</span> <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F) && hzgb2312) {</span> <span class='diff-add'> code_point_pointer.offset(-1);</span> <span class='diff-add'> hzgb2312 = false;</span> <span class='diff-add'> return output_byte_stream.emit(0x7E, 0x7D);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code_point === 0x007E) {</span> <span class='diff-add'> return output_byte_stream.emit(0x7E, 0x7E);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span> <span class='diff-add'> return output_byte_stream.emit(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!hzgb2312) {</span> <span class='diff-add'> code_point_pointer.offset(-1);</span> <span class='diff-add'> hzgb2312 = true;</span> <span class='diff-add'> return output_byte_stream.emit(0x7E, 0x7B);</span> <span class='diff-add'> }</span> <span class='diff-add'> var pointer = indexPointerFor(code_point, index('gb18030'));</span> <span class='diff-add'> if (pointer === null) {</span> <span class='diff-add'> return encoderError(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> var lead = div(pointer, 190) + 1;</span> <span class='diff-add'> var trail = pointer % 190 - 0x3F;</span> <span class='diff-add'> if (!inRange(lead, 0x21, 0x7E) || !inRange(trail, 0x21, 0x7E)) {</span> <span class='diff-add'> return encoderError(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> return output_byte_stream.emit(lead, trail);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['hz-gb-2312'].getEncoder = function(options) {</span> <span class='diff-add'> return new HZGB2312Encoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['hz-gb-2312'].getDecoder = function(options) {</span> <span class='diff-add'> return new HZGB2312Decoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> //</span> <span class='diff-add'> // 11. Legacy multi-byte Chinese (traditional) encodings</span> <span class='diff-add'> //</span> <span class='diff-add'> // 11.1 big5</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function Big5Decoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> var /** @type {number} */ big5_lead = 0x00,</span> <span class='diff-add'> /** @type {?number} */ big5_pending = null;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte steram to decode.</span> <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span> <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.decode = function(byte_pointer) {</span> <span class='diff-add'> // NOTE: Hack to support emitting two code points</span> <span class='diff-add'> if (big5_pending !== null) {</span> <span class='diff-add'> var pending = big5_pending;</span> <span class='diff-add'> big5_pending = null;</span> <span class='diff-add'> return pending;</span> <span class='diff-add'> }</span> <span class='diff-add'> var bite = byte_pointer.get();</span> <span class='diff-add'> if (bite === EOF_byte && big5_lead === 0x00) {</span> <span class='diff-add'> return EOF_code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === EOF_byte && big5_lead !== 0x00) {</span> <span class='diff-add'> big5_lead = 0x00;</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> byte_pointer.offset(1);</span> <span class='diff-add'> if (big5_lead !== 0x00) {</span> <span class='diff-add'> var lead = big5_lead;</span> <span class='diff-add'> var pointer = null;</span> <span class='diff-add'> big5_lead = 0x00;</span> <span class='diff-add'> var offset = bite < 0x7F ? 0x40 : 0x62;</span> <span class='diff-add'> if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0xA1, 0xFE)) {</span> <span class='diff-add'> pointer = (lead - 0x81) * 157 + (bite - offset);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (pointer === 1133) {</span> <span class='diff-add'> big5_pending = 0x0304;</span> <span class='diff-add'> return 0x00CA;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (pointer === 1135) {</span> <span class='diff-add'> big5_pending = 0x030C;</span> <span class='diff-add'> return 0x00CA;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (pointer === 1164) {</span> <span class='diff-add'> big5_pending = 0x0304;</span> <span class='diff-add'> return 0x00EA;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (pointer === 1166) {</span> <span class='diff-add'> big5_pending = 0x030C;</span> <span class='diff-add'> return 0x00EA;</span> <span class='diff-add'> }</span> <span class='diff-add'> var code_point = (pointer === null) ? null :</span> <span class='diff-add'> indexCodePointFor(pointer, index('big5'));</span> <span class='diff-add'> if (pointer === null) {</span> <span class='diff-add'> byte_pointer.offset(-1);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code_point === null) {</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> return code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span> <span class='diff-add'> return bite;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(bite, 0x81, 0xFE)) {</span> <span class='diff-add'> big5_lead = bite;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function Big5Encoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span> <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span> <span class='diff-add'> * @return {number} The last byte emitted.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span> <span class='diff-add'> var code_point = code_point_pointer.get();</span> <span class='diff-add'> if (code_point === EOF_code_point) {</span> <span class='diff-add'> return EOF_byte;</span> <span class='diff-add'> }</span> <span class='diff-add'> code_point_pointer.offset(1);</span> <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span> <span class='diff-add'> return output_byte_stream.emit(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> var pointer = indexPointerFor(code_point, index('big5'));</span> <span class='diff-add'> if (pointer === null) {</span> <span class='diff-add'> return encoderError(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> var lead = div(pointer, 157) + 0x81;</span> <span class='diff-add'> //if (lead < 0xA1) {</span> <span class='diff-add'> // return encoderError(code_point);</span> <span class='diff-add'> //}</span> <span class='diff-add'> var trail = pointer % 157;</span> <span class='diff-add'> var offset = trail < 0x3F ? 0x40 : 0x62;</span> <span class='diff-add'> return output_byte_stream.emit(lead, trail + offset);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['big5'].getEncoder = function(options) {</span> <span class='diff-add'> return new Big5Encoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['big5'].getDecoder = function(options) {</span> <span class='diff-add'> return new Big5Decoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> //</span> <span class='diff-add'> // 12. Legacy multi-byte Japanese encodings</span> <span class='diff-add'> //</span> <span class='diff-add'> // 12.1 euc.jp</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function EUCJPDecoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> var /** @type {number} */ eucjp_first = 0x00,</span> <span class='diff-add'> /** @type {number} */ eucjp_second = 0x00;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span> <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span> <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.decode = function(byte_pointer) {</span> <span class='diff-add'> var bite = byte_pointer.get();</span> <span class='diff-add'> if (bite === EOF_byte) {</span> <span class='diff-add'> if (eucjp_first === 0x00 && eucjp_second === 0x00) {</span> <span class='diff-add'> return EOF_code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> eucjp_first = 0x00;</span> <span class='diff-add'> eucjp_second = 0x00;</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> byte_pointer.offset(1);</span> <span class='diff-add'> var lead, code_point;</span> <span class='diff-add'> if (eucjp_second !== 0x00) {</span> <span class='diff-add'> lead = eucjp_second;</span> <span class='diff-add'> eucjp_second = 0x00;</span> <span class='diff-add'> code_point = null;</span> <span class='diff-add'> if (inRange(lead, 0xA1, 0xFE) && inRange(bite, 0xA1, 0xFE)) {</span> <span class='diff-add'> code_point = indexCodePointFor((lead - 0xA1) * 94 + bite - 0xA1,</span> <span class='diff-add'> index('jis0212'));</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!inRange(bite, 0xA1, 0xFE)) {</span> <span class='diff-add'> byte_pointer.offset(-1);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code_point === null) {</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> return code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (eucjp_first === 0x8E && inRange(bite, 0xA1, 0xDF)) {</span> <span class='diff-add'> eucjp_first = 0x00;</span> <span class='diff-add'> return 0xFF61 + bite - 0xA1;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (eucjp_first === 0x8F && inRange(bite, 0xA1, 0xFE)) {</span> <span class='diff-add'> eucjp_first = 0x00;</span> <span class='diff-add'> eucjp_second = bite;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (eucjp_first !== 0x00) {</span> <span class='diff-add'> lead = eucjp_first;</span> <span class='diff-add'> eucjp_first = 0x00;</span> <span class='diff-add'> code_point = null;</span> <span class='diff-add'> if (inRange(lead, 0xA1, 0xFE) && inRange(bite, 0xA1, 0xFE)) {</span> <span class='diff-add'> code_point = indexCodePointFor((lead - 0xA1) * 94 + bite - 0xA1,</span> <span class='diff-add'> index('jis0208'));</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!inRange(bite, 0xA1, 0xFE)) {</span> <span class='diff-add'> byte_pointer.offset(-1);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code_point === null) {</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> return code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span> <span class='diff-add'> return bite;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === 0x8E || bite === 0x8F || (inRange(bite, 0xA1, 0xFE))) {</span> <span class='diff-add'> eucjp_first = bite;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function EUCJPEncoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span> <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span> <span class='diff-add'> * @return {number} The last byte emitted.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span> <span class='diff-add'> var code_point = code_point_pointer.get();</span> <span class='diff-add'> if (code_point === EOF_code_point) {</span> <span class='diff-add'> return EOF_byte;</span> <span class='diff-add'> }</span> <span class='diff-add'> code_point_pointer.offset(1);</span> <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span> <span class='diff-add'> return output_byte_stream.emit(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code_point === 0x00A5) {</span> <span class='diff-add'> return output_byte_stream.emit(0x5C);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code_point === 0x203E) {</span> <span class='diff-add'> return output_byte_stream.emit(0x7E);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(code_point, 0xFF61, 0xFF9F)) {</span> <span class='diff-add'> return output_byte_stream.emit(0x8E, code_point - 0xFF61 + 0xA1);</span> <span class='diff-add'> }</span> <span class='diff-add'> var pointer = indexPointerFor(code_point, index('jis0208'));</span> <span class='diff-add'> if (pointer === null) {</span> <span class='diff-add'> return encoderError(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> var lead = div(pointer, 94) + 0xA1;</span> <span class='diff-add'> var trail = pointer % 94 + 0xA1;</span> <span class='diff-add'> return output_byte_stream.emit(lead, trail);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['euc-jp'].getEncoder = function(options) {</span> <span class='diff-add'> return new EUCJPEncoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['euc-jp'].getDecoder = function(options) {</span> <span class='diff-add'> return new EUCJPDecoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> // 12.2 iso-2022-jp</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function ISO2022JPDecoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> /** @enum */</span> <span class='diff-add'> var state = {</span> <span class='diff-add'> ASCII: 0,</span> <span class='diff-add'> escape_start: 1,</span> <span class='diff-add'> escape_middle: 2,</span> <span class='diff-add'> escape_final: 3,</span> <span class='diff-add'> lead: 4,</span> <span class='diff-add'> trail: 5,</span> <span class='diff-add'> Katakana: 6</span> <span class='diff-add'> };</span> <span class='diff-add'> var /** @type {number} */ iso2022jp_state = state.ASCII,</span> <span class='diff-add'> /** @type {boolean} */ iso2022jp_jis0212 = false,</span> <span class='diff-add'> /** @type {number} */ iso2022jp_lead = 0x00;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span> <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span> <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.decode = function(byte_pointer) {</span> <span class='diff-add'> var bite = byte_pointer.get();</span> <span class='diff-add'> if (bite !== EOF_byte) {</span> <span class='diff-add'> byte_pointer.offset(1);</span> <span class='diff-add'> }</span> <span class='diff-add'> switch (iso2022jp_state) {</span> <span class='diff-add'> default:</span> <span class='diff-add'> case state.ASCII:</span> <span class='diff-add'> if (bite === 0x1B) {</span> <span class='diff-add'> iso2022jp_state = state.escape_start;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span> <span class='diff-add'> return bite;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === EOF_byte) {</span> <span class='diff-add'> return EOF_code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> case state.escape_start:</span> <span class='diff-add'> if (bite === 0x24 || bite === 0x28) {</span> <span class='diff-add'> iso2022jp_lead = bite;</span> <span class='diff-add'> iso2022jp_state = state.escape_middle;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite !== EOF_byte) {</span> <span class='diff-add'> byte_pointer.offset(-1);</span> <span class='diff-add'> }</span> <span class='diff-add'> iso2022jp_state = state.ASCII;</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> case state.escape_middle:</span> <span class='diff-add'> var lead = iso2022jp_lead;</span> <span class='diff-add'> iso2022jp_lead = 0x00;</span> <span class='diff-add'> if (lead === 0x24 && (bite === 0x40 || bite === 0x42)) {</span> <span class='diff-add'> iso2022jp_jis0212 = false;</span> <span class='diff-add'> iso2022jp_state = state.lead;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (lead === 0x24 && bite === 0x28) {</span> <span class='diff-add'> iso2022jp_state = state.escape_final;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (lead === 0x28 && (bite === 0x42 || bite === 0x4A)) {</span> <span class='diff-add'> iso2022jp_state = state.ASCII;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (lead === 0x28 && bite === 0x49) {</span> <span class='diff-add'> iso2022jp_state = state.Katakana;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === EOF_byte) {</span> <span class='diff-add'> byte_pointer.offset(-1);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> byte_pointer.offset(-2);</span> <span class='diff-add'> }</span> <span class='diff-add'> iso2022jp_state = state.ASCII;</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> case state.escape_final:</span> <span class='diff-add'> if (bite === 0x44) {</span> <span class='diff-add'> iso2022jp_jis0212 = true;</span> <span class='diff-add'> iso2022jp_state = state.lead;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === EOF_byte) {</span> <span class='diff-add'> byte_pointer.offset(-2);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> byte_pointer.offset(-3);</span> <span class='diff-add'> }</span> <span class='diff-add'> iso2022jp_state = state.ASCII;</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> case state.lead:</span> <span class='diff-add'> if (bite === 0x0A) {</span> <span class='diff-add'> iso2022jp_state = state.ASCII;</span> <span class='diff-add'> return decoderError(fatal, 0x000A);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === 0x1B) {</span> <span class='diff-add'> iso2022jp_state = state.escape_start;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === EOF_byte) {</span> <span class='diff-add'> return EOF_code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> iso2022jp_lead = bite;</span> <span class='diff-add'> iso2022jp_state = state.trail;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> case state.trail:</span> <span class='diff-add'> iso2022jp_state = state.lead;</span> <span class='diff-add'> if (bite === EOF_byte) {</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> var code_point = null;</span> <span class='diff-add'> var pointer = (iso2022jp_lead - 0x21) * 94 + bite - 0x21;</span> <span class='diff-add'> if (inRange(iso2022jp_lead, 0x21, 0x7E) &&</span> <span class='diff-add'> inRange(bite, 0x21, 0x7E)) {</span> <span class='diff-add'> code_point = (iso2022jp_jis0212 === false) ?</span> <span class='diff-add'> indexCodePointFor(pointer, index('jis0208')) :</span> <span class='diff-add'> indexCodePointFor(pointer, index('jis0212'));</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code_point === null) {</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> return code_point;</span> <span class='diff-add'> case state.Katakana:</span> <span class='diff-add'> if (bite === 0x1B) {</span> <span class='diff-add'> iso2022jp_state = state.escape_start;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(bite, 0x21, 0x5F)) {</span> <span class='diff-add'> return 0xFF61 + bite - 0x21;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === EOF_byte) {</span> <span class='diff-add'> return EOF_code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function ISO2022JPEncoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> /** @enum */</span> <span class='diff-add'> var state = {</span> <span class='diff-add'> ASCII: 0,</span> <span class='diff-add'> lead: 1,</span> <span class='diff-add'> Katakana: 2</span> <span class='diff-add'> };</span> <span class='diff-add'> var /** @type {number} */ iso2022jp_state = state.ASCII;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span> <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span> <span class='diff-add'> * @return {number} The last byte emitted.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span> <span class='diff-add'> var code_point = code_point_pointer.get();</span> <span class='diff-add'> if (code_point === EOF_code_point) {</span> <span class='diff-add'> return EOF_byte;</span> <span class='diff-add'> }</span> <span class='diff-add'> code_point_pointer.offset(1);</span> <span class='diff-add'> if ((inRange(code_point, 0x0000, 0x007F) ||</span> <span class='diff-add'> code_point === 0x00A5 || code_point === 0x203E) &&</span> <span class='diff-add'> iso2022jp_state !== state.ASCII) {</span> <span class='diff-add'> code_point_pointer.offset(-1);</span> <span class='diff-add'> iso2022jp_state = state.ASCII;</span> <span class='diff-add'> return output_byte_stream.emit(0x1B, 0x28, 0x42);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span> <span class='diff-add'> return output_byte_stream.emit(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code_point === 0x00A5) {</span> <span class='diff-add'> return output_byte_stream.emit(0x5C);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code_point === 0x203E) {</span> <span class='diff-add'> return output_byte_stream.emit(0x7E);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(code_point, 0xFF61, 0xFF9F) &&</span> <span class='diff-add'> iso2022jp_state !== state.Katakana) {</span> <span class='diff-add'> code_point_pointer.offset(-1);</span> <span class='diff-add'> iso2022jp_state = state.Katakana;</span> <span class='diff-add'> return output_byte_stream.emit(0x1B, 0x28, 0x49);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(code_point, 0xFF61, 0xFF9F)) {</span> <span class='diff-add'> return output_byte_stream.emit(code_point - 0xFF61 - 0x21);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (iso2022jp_state !== state.lead) {</span> <span class='diff-add'> code_point_pointer.offset(-1);</span> <span class='diff-add'> iso2022jp_state = state.lead;</span> <span class='diff-add'> return output_byte_stream.emit(0x1B, 0x24, 0x42);</span> <span class='diff-add'> }</span> <span class='diff-add'> var pointer = indexPointerFor(code_point, index('jis0208'));</span> <span class='diff-add'> if (pointer === null) {</span> <span class='diff-add'> return encoderError(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> var lead = div(pointer, 94) + 0x21;</span> <span class='diff-add'> var trail = pointer % 94 + 0x21;</span> <span class='diff-add'> return output_byte_stream.emit(lead, trail);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['iso-2022-jp'].getEncoder = function(options) {</span> <span class='diff-add'> return new ISO2022JPEncoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['iso-2022-jp'].getDecoder = function(options) {</span> <span class='diff-add'> return new ISO2022JPDecoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> // 12.3 shift_jis</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function ShiftJISDecoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> var /** @type {number} */ shiftjis_lead = 0x00;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span> <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span> <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.decode = function(byte_pointer) {</span> <span class='diff-add'> var bite = byte_pointer.get();</span> <span class='diff-add'> if (bite === EOF_byte && shiftjis_lead === 0x00) {</span> <span class='diff-add'> return EOF_code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === EOF_byte && shiftjis_lead !== 0x00) {</span> <span class='diff-add'> shiftjis_lead = 0x00;</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> byte_pointer.offset(1);</span> <span class='diff-add'> if (shiftjis_lead !== 0x00) {</span> <span class='diff-add'> var lead = shiftjis_lead;</span> <span class='diff-add'> shiftjis_lead = 0x00;</span> <span class='diff-add'> if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFC)) {</span> <span class='diff-add'> var offset = (bite < 0x7F) ? 0x40 : 0x41;</span> <span class='diff-add'> var lead_offset = (lead < 0xA0) ? 0x81 : 0xC1;</span> <span class='diff-add'> var code_point = indexCodePointFor((lead - lead_offset) * 188 +</span> <span class='diff-add'> bite - offset, index('jis0208'));</span> <span class='diff-add'> if (code_point === null) {</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> return code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> byte_pointer.offset(-1);</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(bite, 0x00, 0x80)) {</span> <span class='diff-add'> return bite;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(bite, 0xA1, 0xDF)) {</span> <span class='diff-add'> return 0xFF61 + bite - 0xA1;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(bite, 0x81, 0x9F) || inRange(bite, 0xE0, 0xFC)) {</span> <span class='diff-add'> shiftjis_lead = bite;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function ShiftJISEncoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span> <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span> <span class='diff-add'> * @return {number} The last byte emitted.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span> <span class='diff-add'> var code_point = code_point_pointer.get();</span> <span class='diff-add'> if (code_point === EOF_code_point) {</span> <span class='diff-add'> return EOF_byte;</span> <span class='diff-add'> }</span> <span class='diff-add'> code_point_pointer.offset(1);</span> <span class='diff-add'> if (inRange(code_point, 0x0000, 0x0080)) {</span> <span class='diff-add'> return output_byte_stream.emit(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code_point === 0x00A5) {</span> <span class='diff-add'> return output_byte_stream.emit(0x5C);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code_point === 0x203E) {</span> <span class='diff-add'> return output_byte_stream.emit(0x7E);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(code_point, 0xFF61, 0xFF9F)) {</span> <span class='diff-add'> return output_byte_stream.emit(code_point - 0xFF61 + 0xA1);</span> <span class='diff-add'> }</span> <span class='diff-add'> var pointer = indexPointerFor(code_point, index('jis0208'));</span> <span class='diff-add'> if (pointer === null) {</span> <span class='diff-add'> return encoderError(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> var lead = div(pointer, 188);</span> <span class='diff-add'> var lead_offset = lead < 0x1F ? 0x81 : 0xC1;</span> <span class='diff-add'> var trail = pointer % 188;</span> <span class='diff-add'> var offset = trail < 0x3F ? 0x40 : 0x41;</span> <span class='diff-add'> return output_byte_stream.emit(lead + lead_offset, trail + offset);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['shift_jis'].getEncoder = function(options) {</span> <span class='diff-add'> return new ShiftJISEncoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['shift_jis'].getDecoder = function(options) {</span> <span class='diff-add'> return new ShiftJISDecoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> //</span> <span class='diff-add'> // 13. Legacy multi-byte Korean encodings</span> <span class='diff-add'> //</span> <span class='diff-add'> // 13.1 euc-kr</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function EUCKRDecoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> var /** @type {number} */ euckr_lead = 0x00;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span> <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span> <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.decode = function(byte_pointer) {</span> <span class='diff-add'> var bite = byte_pointer.get();</span> <span class='diff-add'> if (bite === EOF_byte && euckr_lead === 0) {</span> <span class='diff-add'> return EOF_code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === EOF_byte && euckr_lead !== 0) {</span> <span class='diff-add'> euckr_lead = 0x00;</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> byte_pointer.offset(1);</span> <span class='diff-add'> if (euckr_lead !== 0x00) {</span> <span class='diff-add'> var lead = euckr_lead;</span> <span class='diff-add'> var pointer = null;</span> <span class='diff-add'> euckr_lead = 0x00;</span> <span class='diff-add'> if (inRange(lead, 0x81, 0xC6)) {</span> <span class='diff-add'> var temp = (26 + 26 + 126) * (lead - 0x81);</span> <span class='diff-add'> if (inRange(bite, 0x41, 0x5A)) {</span> <span class='diff-add'> pointer = temp + bite - 0x41;</span> <span class='diff-add'> } else if (inRange(bite, 0x61, 0x7A)) {</span> <span class='diff-add'> pointer = temp + 26 + bite - 0x61;</span> <span class='diff-add'> } else if (inRange(bite, 0x81, 0xFE)) {</span> <span class='diff-add'> pointer = temp + 26 + 26 + bite - 0x81;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(lead, 0xC7, 0xFD) && inRange(bite, 0xA1, 0xFE)) {</span> <span class='diff-add'> pointer = (26 + 26 + 126) * (0xC7 - 0x81) + (lead - 0xC7) * 94 +</span> <span class='diff-add'> (bite - 0xA1);</span> <span class='diff-add'> }</span> <span class='diff-add'> var code_point = (pointer === null) ? null :</span> <span class='diff-add'> indexCodePointFor(pointer, index('euc-kr'));</span> <span class='diff-add'> if (pointer === null) {</span> <span class='diff-add'> byte_pointer.offset(-1);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code_point === null) {</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> return code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span> <span class='diff-add'> return bite;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(bite, 0x81, 0xFD)) {</span> <span class='diff-add'> euckr_lead = bite;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function EUCKREncoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span> <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span> <span class='diff-add'> * @return {number} The last byte emitted.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span> <span class='diff-add'> var code_point = code_point_pointer.get();</span> <span class='diff-add'> if (code_point === EOF_code_point) {</span> <span class='diff-add'> return EOF_byte;</span> <span class='diff-add'> }</span> <span class='diff-add'> code_point_pointer.offset(1);</span> <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span> <span class='diff-add'> return output_byte_stream.emit(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> var pointer = indexPointerFor(code_point, index('euc-kr'));</span> <span class='diff-add'> if (pointer === null) {</span> <span class='diff-add'> return encoderError(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> var lead, trail;</span> <span class='diff-add'> if (pointer < ((26 + 26 + 126) * (0xC7 - 0x81))) {</span> <span class='diff-add'> lead = div(pointer, (26 + 26 + 126)) + 0x81;</span> <span class='diff-add'> trail = pointer % (26 + 26 + 126);</span> <span class='diff-add'> var offset = trail < 26 ? 0x41 : trail < 26 + 26 ? 0x47 : 0x4D;</span> <span class='diff-add'> return output_byte_stream.emit(lead, trail + offset);</span> <span class='diff-add'> }</span> <span class='diff-add'> pointer = pointer - (26 + 26 + 126) * (0xC7 - 0x81);</span> <span class='diff-add'> lead = div(pointer, 94) + 0xC7;</span> <span class='diff-add'> trail = pointer % 94 + 0xA1;</span> <span class='diff-add'> return output_byte_stream.emit(lead, trail);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['euc-kr'].getEncoder = function(options) {</span> <span class='diff-add'> return new EUCKREncoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['euc-kr'].getDecoder = function(options) {</span> <span class='diff-add'> return new EUCKRDecoder(options);</span> <span class='diff-add'> };</span> <span class='diff-add'> //</span> <span class='diff-add'> // 14. Legacy miscellaneous encodings</span> <span class='diff-add'> //</span> <span class='diff-add'> // 14.1 replacement</span> <span class='diff-add'> // Not needed - API throws TypeError</span> <span class='diff-add'> // 14.2 utf-16</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {boolean} utf16_be True if big-endian, false if little-endian.</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function UTF16Decoder(utf16_be, options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> var /** @type {?number} */ utf16_lead_byte = null,</span> <span class='diff-add'> /** @type {?number} */ utf16_lead_surrogate = null;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span> <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span> <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.decode = function(byte_pointer) {</span> <span class='diff-add'> var bite = byte_pointer.get();</span> <span class='diff-add'> if (bite === EOF_byte && utf16_lead_byte === null &&</span> <span class='diff-add'> utf16_lead_surrogate === null) {</span> <span class='diff-add'> return EOF_code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (bite === EOF_byte && (utf16_lead_byte !== null ||</span> <span class='diff-add'> utf16_lead_surrogate !== null)) {</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> byte_pointer.offset(1);</span> <span class='diff-add'> if (utf16_lead_byte === null) {</span> <span class='diff-add'> utf16_lead_byte = bite;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> var code_point;</span> <span class='diff-add'> if (utf16_be) {</span> <span class='diff-add'> code_point = (utf16_lead_byte << 8) + bite;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> code_point = (bite << 8) + utf16_lead_byte;</span> <span class='diff-add'> }</span> <span class='diff-add'> utf16_lead_byte = null;</span> <span class='diff-add'> if (utf16_lead_surrogate !== null) {</span> <span class='diff-add'> var lead_surrogate = utf16_lead_surrogate;</span> <span class='diff-add'> utf16_lead_surrogate = null;</span> <span class='diff-add'> if (inRange(code_point, 0xDC00, 0xDFFF)) {</span> <span class='diff-add'> return 0x10000 + (lead_surrogate - 0xD800) * 0x400 +</span> <span class='diff-add'> (code_point - 0xDC00);</span> <span class='diff-add'> }</span> <span class='diff-add'> byte_pointer.offset(-2);</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(code_point, 0xD800, 0xDBFF)) {</span> <span class='diff-add'> utf16_lead_surrogate = code_point;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(code_point, 0xDC00, 0xDFFF)) {</span> <span class='diff-add'> return decoderError(fatal);</span> <span class='diff-add'> }</span> <span class='diff-add'> return code_point;</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {boolean} utf16_be True if big-endian, false if little-endian.</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function UTF16Encoder(utf16_be, options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span> <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span> <span class='diff-add'> * @return {number} The last byte emitted.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {number} code_unit</span> <span class='diff-add'> * @return {number} last byte emitted</span> <span class='diff-add'> */</span> <span class='diff-add'> function convert_to_bytes(code_unit) {</span> <span class='diff-add'> var byte1 = code_unit >> 8;</span> <span class='diff-add'> var byte2 = code_unit & 0x00FF;</span> <span class='diff-add'> if (utf16_be) {</span> <span class='diff-add'> return output_byte_stream.emit(byte1, byte2);</span> <span class='diff-add'> }</span> <span class='diff-add'> return output_byte_stream.emit(byte2, byte1);</span> <span class='diff-add'> }</span> <span class='diff-add'> var code_point = code_point_pointer.get();</span> <span class='diff-add'> if (code_point === EOF_code_point) {</span> <span class='diff-add'> return EOF_byte;</span> <span class='diff-add'> }</span> <span class='diff-add'> code_point_pointer.offset(1);</span> <span class='diff-add'> if (inRange(code_point, 0xD800, 0xDFFF)) {</span> <span class='diff-add'> encoderError(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (code_point <= 0xFFFF) {</span> <span class='diff-add'> return convert_to_bytes(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> var lead = div((code_point - 0x10000), 0x400) + 0xD800;</span> <span class='diff-add'> var trail = ((code_point - 0x10000) % 0x400) + 0xDC00;</span> <span class='diff-add'> convert_to_bytes(lead);</span> <span class='diff-add'> return convert_to_bytes(trail);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> // 14.3 utf-16be</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['utf-16be'].getEncoder = function(options) {</span> <span class='diff-add'> return new UTF16Encoder(true, options);</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['utf-16be'].getDecoder = function(options) {</span> <span class='diff-add'> return new UTF16Decoder(true, options);</span> <span class='diff-add'> };</span> <span class='diff-add'> // 14.4 utf-16le</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['utf-16le'].getEncoder = function(options) {</span> <span class='diff-add'> return new UTF16Encoder(false, options);</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['utf-16le'].getDecoder = function(options) {</span> <span class='diff-add'> return new UTF16Decoder(false, options);</span> <span class='diff-add'> };</span> <span class='diff-add'> // 14.5 x-user-defined</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function XUserDefinedDecoder(options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span> <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span> <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.decode = function(byte_pointer) {</span> <span class='diff-add'> var bite = byte_pointer.get();</span> <span class='diff-add'> if (bite === EOF_byte) {</span> <span class='diff-add'> return EOF_code_point;</span> <span class='diff-add'> }</span> <span class='diff-add'> byte_pointer.offset(1);</span> <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span> <span class='diff-add'> return bite;</span> <span class='diff-add'> }</span> <span class='diff-add'> return 0xF780 + bite - 0x80;</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {{fatal: boolean}} options</span> <span class='diff-add'> */</span> <span class='diff-add'> function XUserDefinedEncoder(index, options) {</span> <span class='diff-add'> var fatal = options.fatal;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span> <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span> <span class='diff-add'> * @return {number} The last byte emitted.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span> <span class='diff-add'> var code_point = code_point_pointer.get();</span> <span class='diff-add'> if (code_point === EOF_code_point) {</span> <span class='diff-add'> return EOF_byte;</span> <span class='diff-add'> }</span> <span class='diff-add'> code_point_pointer.offset(1);</span> <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span> <span class='diff-add'> return output_byte_stream.emit(code_point);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (inRange(code_point, 0xF780, 0xF7FF)) {</span> <span class='diff-add'> return output_byte_stream.emit(code_point - 0xF780 + 0x80);</span> <span class='diff-add'> }</span> <span class='diff-add'> encoderError(code_point);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['x-user-defined'].getEncoder = function(options) {</span> <span class='diff-add'> return new XUserDefinedEncoder(false, options);</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @param {{fatal: boolean}} options */</span> <span class='diff-add'> name_to_encoding['x-user-defined'].getDecoder = function(options) {</span> <span class='diff-add'> return new XUserDefinedDecoder(false, options);</span> <span class='diff-add'> };</span> <span class='diff-add'> // NOTE: currently unused</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {string} label The encoding label.</span> <span class='diff-add'> * @param {ByteInputStream} input_stream The byte stream to test.</span> <span class='diff-add'> */</span> <span class='diff-add'> function detectEncoding(label, input_stream) {</span> <span class='diff-add'> if (input_stream.match([0xFF, 0xFE])) {</span> <span class='diff-add'> input_stream.offset(2);</span> <span class='diff-add'> return 'utf-16le';</span> <span class='diff-add'> }</span> <span class='diff-add'> if (input_stream.match([0xFE, 0xFF])) {</span> <span class='diff-add'> input_stream.offset(2);</span> <span class='diff-add'> return 'utf-16be';</span> <span class='diff-add'> }</span> <span class='diff-add'> if (input_stream.match([0xEF, 0xBB, 0xBF])) {</span> <span class='diff-add'> input_stream.offset(3);</span> <span class='diff-add'> return 'utf-8';</span> <span class='diff-add'> }</span> <span class='diff-add'> return label;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!('TextEncoder' in global)) global['TextEncoder'] = TextEncoder;</span> <span class='diff-add'> if (!('TextDecoder' in global)) global['TextDecoder'] = TextDecoder;</span> <span class='diff-add'>}(this));</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/events.js b/ipynb/Array-feature-overlap-05_files/events.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..48d3183</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/events.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>// Give us an object to bind all events to. This object should be created</span> <span class='diff-add'>// before all other objects so it exists when others register event handlers.</span> <span class='diff-add'>// To register an event handler:</span> <span class='diff-add'>//</span> <span class='diff-add'>// require(['base/js/events'], function (events) {</span> <span class='diff-add'>// events.on("event.Namespace", function () { do_stuff(); });</span> <span class='diff-add'>// });</span> <span class='diff-add'>define(['base/js/namespace', 'jquery'], function(IPython, $) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var Events = function () {};</span> <span class='diff-add'> </span> <span class='diff-add'> var events = new Events();</span> <span class='diff-add'> </span> <span class='diff-add'> // Backwards compatability.</span> <span class='diff-add'> IPython.Events = Events;</span> <span class='diff-add'> IPython.events = events;</span> <span class='diff-add'> </span> <span class='diff-add'> return $([events]);</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/gfm.js b/ipynb/Array-feature-overlap-05_files/gfm.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..80a8e2c</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/gfm.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span> <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span> <span class='diff-add'>(function(mod) {</span> <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span> <span class='diff-add'> mod(require("../../lib/codemirror"), require("../markdown/markdown"), require("../../addon/mode/overlay"));</span> <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span> <span class='diff-add'> define(["../../lib/codemirror", "../markdown/markdown", "../../addon/mode/overlay"], mod);</span> <span class='diff-add'> else // Plain browser env</span> <span class='diff-add'> mod(CodeMirror);</span> <span class='diff-add'>})(function(CodeMirror) {</span> <span class='diff-add'>"use strict";</span> <span class='diff-add'>CodeMirror.defineMode("gfm", function(config, modeConfig) {</span> <span class='diff-add'> var codeDepth = 0;</span> <span class='diff-add'> function blankLine(state) {</span> <span class='diff-add'> state.code = false;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> var gfmOverlay = {</span> <span class='diff-add'> startState: function() {</span> <span class='diff-add'> return {</span> <span class='diff-add'> code: false,</span> <span class='diff-add'> codeBlock: false,</span> <span class='diff-add'> ateSpace: false</span> <span class='diff-add'> };</span> <span class='diff-add'> },</span> <span class='diff-add'> copyState: function(s) {</span> <span class='diff-add'> return {</span> <span class='diff-add'> code: s.code,</span> <span class='diff-add'> codeBlock: s.codeBlock,</span> <span class='diff-add'> ateSpace: s.ateSpace</span> <span class='diff-add'> };</span> <span class='diff-add'> },</span> <span class='diff-add'> token: function(stream, state) {</span> <span class='diff-add'> state.combineTokens = null;</span> <span class='diff-add'> // Hack to prevent formatting override inside code blocks (block and inline)</span> <span class='diff-add'> if (state.codeBlock) {</span> <span class='diff-add'> if (stream.match(/^```/)) {</span> <span class='diff-add'> state.codeBlock = false;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> stream.skipToEnd();</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (stream.sol()) {</span> <span class='diff-add'> state.code = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (stream.sol() && stream.match(/^```/)) {</span> <span class='diff-add'> stream.skipToEnd();</span> <span class='diff-add'> state.codeBlock = true;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> // If this block is changed, it may need to be updated in Markdown mode</span> <span class='diff-add'> if (stream.peek() === '`') {</span> <span class='diff-add'> stream.next();</span> <span class='diff-add'> var before = stream.pos;</span> <span class='diff-add'> stream.eatWhile('`');</span> <span class='diff-add'> var difference = 1 + stream.pos - before;</span> <span class='diff-add'> if (!state.code) {</span> <span class='diff-add'> codeDepth = difference;</span> <span class='diff-add'> state.code = true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> if (difference === codeDepth) { // Must be exact</span> <span class='diff-add'> state.code = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return null;</span> <span class='diff-add'> } else if (state.code) {</span> <span class='diff-add'> stream.next();</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Check if space. If so, links can be formatted later on</span> <span class='diff-add'> if (stream.eatSpace()) {</span> <span class='diff-add'> state.ateSpace = true;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (stream.sol() || state.ateSpace) {</span> <span class='diff-add'> state.ateSpace = false;</span> <span class='diff-add'> if(stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?:[a-f0-9]{7,40}\b)/)) {</span> <span class='diff-add'> // User/Project@SHA</span> <span class='diff-add'> // User@SHA</span> <span class='diff-add'> // SHA</span> <span class='diff-add'> state.combineTokens = true;</span> <span class='diff-add'> return "link";</span> <span class='diff-add'> } else if (stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/)) {</span> <span class='diff-add'> // User/Project#Num</span> <span class='diff-add'> // User#Num</span> <span class='diff-add'> // #Num</span> <span class='diff-add'> state.combineTokens = true;</span> <span class='diff-add'> return "link";</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (stream.match(/^((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i) &&</span> <span class='diff-add'> stream.string.slice(stream.start - 2, stream.start) != "](") {</span> <span class='diff-add'> // URLs</span> <span class='diff-add'> // Taken from http://daringfireball.net/2010/07/improved_regex_for_matching_urls</span> <span class='diff-add'> // And then (issue #1160) simplified to make it not crash the Chrome Regexp engine</span> <span class='diff-add'> state.combineTokens = true;</span> <span class='diff-add'> return "link";</span> <span class='diff-add'> }</span> <span class='diff-add'> stream.next();</span> <span class='diff-add'> return null;</span> <span class='diff-add'> },</span> <span class='diff-add'> blankLine: blankLine</span> <span class='diff-add'> };</span> <span class='diff-add'> var markdownConfig = {</span> <span class='diff-add'> underscoresBreakWords: false,</span> <span class='diff-add'> taskLists: true,</span> <span class='diff-add'> fencedCodeBlocks: true,</span> <span class='diff-add'> strikethrough: true</span> <span class='diff-add'> };</span> <span class='diff-add'> for (var attr in modeConfig) {</span> <span class='diff-add'> markdownConfig[attr] = modeConfig[attr];</span> <span class='diff-add'> }</span> <span class='diff-add'> markdownConfig.name = "markdown";</span> <span class='diff-add'> CodeMirror.defineMIME("gfmBase", markdownConfig);</span> <span class='diff-add'> return CodeMirror.overlayMode(CodeMirror.getMode(config, "gfmBase"), gfmOverlay);</span> <span class='diff-add'>}, "markdown");</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/half-shell___Lab_notebook_of_Steven_Roberts_1ACECD10.png b/ipynb/Array-feature-overlap-05_files/half-shell___Lab_notebook_of_Steven_Roberts_1ACECD10.png</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..a0b9b74</span> Binary files /dev/null and b/ipynb/Array-feature-overlap-05_files/half-shell___Lab_notebook_of_Steven_Roberts_1ACECD10.png differ <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/html-css-sanitizer-minified.js b/ipynb/Array-feature-overlap-05_files/html-css-sanitizer-minified.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..d6094fc</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/html-css-sanitizer-minified.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>var CSS_PROP_BIT_QUANTITY=1;var CSS_PROP_BIT_HASH_VALUE=2;var CSS_PROP_BIT_NEGATIVE_QUANTITY=4;var CSS_PROP_BIT_QSTRING=8;var CSS_PROP_BIT_URL=16;var CSS_PROP_BIT_UNRESERVED_WORD=64;var CSS_PROP_BIT_UNICODE_RANGE=128;var CSS_PROP_BIT_GLOBAL_NAME=512;var CSS_PROP_BIT_PROPERTY_NAME=1024;var cssSchema=function(){var L=[["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","transparent","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"],["all-scroll","col-resize","crosshair","default","e-resize","hand","help","move","n-resize","ne-resize","no-drop","not-allowed","nw-resize","pointer","progress","row-resize","s-resize","se-resize","sw-resize","text","vertical-text","w-resize","wait"],["armenian","decimal","decimal-leading-zero","disc","georgian","lower-alpha","lower-greek","lower-latin","lower-roman","square","upper-alpha","upper-latin","upper-roman"],["100","200","300","400","500","600","700","800","900","bold","bolder","lighter"],["block-level","inline-level","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group"],["condensed","expanded","extra-condensed","extra-expanded","narrower","semi-condensed","semi-expanded","ultra-condensed","ultra-expanded","wider"],["inherit","inline","inline-block","inline-box","inline-flex","inline-grid","inline-list-item","inline-stack","inline-table","run-in"],["behind","center-left","center-right","far-left","far-right","left-side","leftwards","right-side","rightwards"],["large","larger","small","smaller","x-large","x-small","xx-large","xx-small"],["dashed","dotted","double","groove","outset","ridge","solid"],["ease","ease-in","ease-in-out","ease-out","linear","step-end","step-start"],["at","closest-corner","closest-side","ellipse","farthest-corner","farthest-side"],["baseline","middle","sub","super","text-bottom","text-top"],["caption","icon","menu","message-box","small-caption","status-bar"],["fast","faster","slow","slower","x-fast","x-slow"],["above","below","higher","level","lower"],["cursive","fantasy","monospace","sans-serif","serif"],["loud","silent","soft","x-loud","x-soft"],["no-repeat","repeat-x","repeat-y","round","space"],["blink","line-through","overline","underline"],["block","flex","grid","table"],["high","low","x-high","x-low"],["nowrap","pre","pre-line","pre-wrap"],["absolute","relative","static"],["alternate","alternate-reverse","reverse"],["border-box","content-box","padding-box"],["capitalize","lowercase","uppercase"],["child","female","male"],["=","opacity"],["backwards","forwards"],["bidi-override","embed"],["bottom","top"],["break-all","keep-all"],["clip","ellipsis"],["contain","cover"],["continuous","digits"],["end","start"],["flat","preserve-3d"],["hide","show"],["horizontal","vertical"],["inside","outside"],["italic","oblique"],["left","right"],["ltr","rtl"],["no-content","no-display"],["paused","running"],["suppress","unrestricted"],["thick","thin"],[","],["/"],["all"],["always"],["auto"],["avoid"],["both"],["break-word"],["center"],["circle"],["code"],["collapse"],["contents"],["fixed"],["hidden"],["infinite"],["inset"],["invert"],["justify"],["list-item"],["local"],["medium"],["mix"],["none"],["normal"],["once"],["repeat"],["scroll"],["separate"],["small-caps"],["spell-out"],["to"],["visible"]];var schema={animation:{cssPropBits:517,cssLitGroup:[L[10],L[24],L[29],L[45],L[48],L[54],L[63],L[71],L[72]],cssFns:["cubic-bezier()","steps()"]},"animation-delay":{cssPropBits:5,cssLitGroup:[L[48]],cssFns:[]},"animation-direction":{cssPropBits:0,cssLitGroup:[L[24],L[48],L[72]],cssFns:[]},"animation-duration":"animation-delay","animation-fill-mode":{cssPropBits:0,cssLitGroup:[L[29],L[48],L[54],L[71]],cssFns:[]},"animation-iteration-count":{cssPropBits:5,cssLitGroup:[L[48],L[63]],cssFns:[]},"animation-name":{cssPropBits:512,cssLitGroup:[L[48],L[71]],cssFns:[]},"animation-play-state":{cssPropBits:0,cssLitGroup:[L[45],L[48]],cssFns:[]},"animation-timing-function":{cssPropBits:0,cssLitGroup:[L[10],L[48]],cssFns:["cubic-bezier()","steps()"]},appearance:{cssPropBits:0,cssLitGroup:[L[71]],cssFns:[]},azimuth:{cssPropBits:5,cssLitGroup:[L[7],L[42],L[56]],cssFns:[]},"backface-visibility":{cssPropBits:0,cssLitGroup:[L[59],L[62],L[80]],cssFns:[]},background:{cssPropBits:23,cssLitGroup:[L[0],L[18],L[25],L[31],L[34],L[42],L[48],L[49],L[52],L[56],L[61],L[68],L[71],L[74],L[75]],cssFns:["image()","linear-gradient()","radial-gradient()","repeating-linear-gradient()","repeating-radial-gradient()","rgb()","rgba()"]},"background-attachment":{cssPropBits:0,cssLitGroup:[L[48],L[61],L[68],L[75]],cssFns:[]},"background-color":{cssPropBits:2,cssLitGroup:[L[0]],cssFns:["rgb()","rgba()"]},"background-image":{cssPropBits:16,cssLitGroup:[L[48],L[71]],cssFns:["image()","linear-gradient()","radial-gradient()","repeating-linear-gradient()","repeating-radial-gradient()"]},"background-position":{cssPropBits:5,cssLitGroup:[L[31],L[42],L[48],L[56]],cssFns:[]},"background-repeat":{cssPropBits:0,cssLitGroup:[L[18],L[48],L[74]],cssFns:[]},"background-size":{cssPropBits:5,cssLitGroup:[L[34],L[48],L[52]],cssFns:[]},border:{cssPropBits:7,cssLitGroup:[L[0],L[9],L[47],L[62],L[64],L[69],L[71]],cssFns:["rgb()","rgba()"]},"border-bottom":"border","border-bottom-color":"background-color","border-bottom-left-radius":{cssPropBits:5,cssFns:[]},"border-bottom-right-radius":"border-bottom-left-radius","border-bottom-style":{cssPropBits:0,cssLitGroup:[L[9],L[62],L[64],L[71]],cssFns:[]},"border-bottom-width":{cssPropBits:5,cssLitGroup:[L[47],L[69]],cssFns:[]},"border-collapse":{cssPropBits:0,cssLitGroup:[L[59],L[76]],cssFns:[]},"border-color":"background-color","border-left":"border","border-left-color":"background-color","border-left-style":"border-bottom-style","border-left-width":"border-bottom-width","border-radius":{cssPropBits:5,cssLitGroup:[L[49]],cssFns:[]},"border-right":"border","border-right-color":"background-color","border-right-style":"border-bottom-style","border-right-width":"border-bottom-width","border-spacing":"border-bottom-left-radius","border-style":"border-bottom-style","border-top":"border","border-top-color":"background-color","border-top-left-radius":"border-bottom-left-radius","border-top-right-radius":"border-bottom-left-radius","border-top-style":"border-bottom-style","border-top-width":"border-bottom-width","border-width":"border-bottom-width",bottom:{cssPropBits:5,cssLitGroup:[L[52]],cssFns:[]},box:{cssPropBits:0,cssLitGroup:[L[60],L[71],L[72]],cssFns:[]},"box-shadow":{cssPropBits:7,cssLitGroup:[L[0],L[48],L[64],L[71]],cssFns:["rgb()","rgba()"]},"box-sizing":{cssPropBits:0,cssLitGroup:[L[25]],cssFns:[]},"caption-side":{cssPropBits:0,cssLitGroup:[L[31]],cssFns:[]},clear:{cssPropBits:0,cssLitGroup:[L[42],L[54],L[71]],cssFns:[]},clip:{cssPropBits:0,cssLitGroup:[L[52]],cssFns:["rect()"]},color:"background-color",content:{cssPropBits:8,cssLitGroup:[L[71],L[72]],cssFns:[]},cue:{cssPropBits:16,cssLitGroup:[L[71]],cssFns:[]},"cue-after":"cue","cue-before":"cue",cursor:{cssPropBits:16,cssLitGroup:[L[1],L[48],L[52]],cssFns:[]},direction:{cssPropBits:0,cssLitGroup:[L[43]],cssFns:[]},display:{cssPropBits:0,cssLitGroup:[L[4],L[6],L[20],L[52],L[67],L[71]],cssFns:[]},"display-extras":{cssPropBits:0,cssLitGroup:[L[67],L[71]],cssFns:[]},"display-inside":{cssPropBits:0,cssLitGroup:[L[20],L[52]],cssFns:[]},"display-outside":{cssPropBits:0,cssLitGroup:[L[4],L[71]],cssFns:[]},elevation:{cssPropBits:5,cssLitGroup:[L[15]],cssFns:[]},"empty-cells":{cssPropBits:0,cssLitGroup:[L[38]],cssFns:[]},filter:{cssPropBits:0,cssFns:["alpha()"]},"float":{cssPropBits:0,cssLitGroup:[L[42],L[71]],cssFns:[]},font:{cssPropBits:73,cssLitGroup:[L[3],L[8],L[13],L[16],L[41],L[48],L[49],L[69],L[72],L[77]],cssFns:[]},"font-family":{cssPropBits:72,cssLitGroup:[L[16],L[48]],cssFns:[]},"font-size":{cssPropBits:1,cssLitGroup:[L[8],L[69]],cssFns:[]},"font-stretch":{cssPropBits:0,cssLitGroup:[L[5],L[72]],cssFns:[]},"font-style":{cssPropBits:0,cssLitGroup:[L[41],L[72]],cssFns:[]},"font-variant":{cssPropBits:0,cssLitGroup:[L[72],L[77]],cssFns:[]},"font-weight":{cssPropBits:0,cssLitGroup:[L[3],L[72]],cssFns:[]},height:"bottom",left:"bottom","letter-spacing":{cssPropBits:5,cssLitGroup:[L[72]],cssFns:[]},"line-height":{cssPropBits:1,cssLitGroup:[L[72]],cssFns:[]},"list-style":{cssPropBits:16,cssLitGroup:[L[2],L[40],L[57],L[71]],cssFns:["image()","linear-gradient()","radial-gradient()","repeating-linear-gradient()","repeating-radial-gradient()"]},"list-style-image":{cssPropBits:16,cssLitGroup:[L[71]],cssFns:["image()","linear-gradient()","radial-gradient()","repeating-linear-gradient()","repeating-radial-gradient()"]},"list-style-position":{cssPropBits:0,cssLitGroup:[L[40]],cssFns:[]},"list-style-type":{cssPropBits:0,cssLitGroup:[L[2],L[57],L[71]],cssFns:[]},margin:"bottom","margin-bottom":"bottom","margin-left":"bottom","margin-right":"bottom","margin-top":"bottom","max-height":{cssPropBits:1,cssLitGroup:[L[52],L[71]],cssFns:[]},"max-width":"max-height","min-height":{cssPropBits:1,cssLitGroup:[L[52]],cssFns:[]},"min-width":"min-height",opacity:{cssPropBits:1,cssFns:[]},outline:{cssPropBits:7,cssLitGroup:[L[0],L[9],L[47],L[62],L[64],L[65],L[69],L[71]],cssFns:["rgb()","rgba()"]},"outline-color":{cssPropBits:2,cssLitGroup:[L[0],L[65]],cssFns:["rgb()","rgba()"]},"outline-style":"border-bottom-style","outline-width":"border-bottom-width",overflow:{cssPropBits:0,cssLitGroup:[L[52],L[62],L[75],L[80]],cssFns:[]},"overflow-wrap":{cssPropBits:0,cssLitGroup:[L[55],L[72]],cssFns:[]},"overflow-x":{cssPropBits:0,cssLitGroup:[L[44],L[52],L[62],L[75],L[80]],cssFns:[]},"overflow-y":"overflow-x",padding:"opacity","padding-bottom":"opacity","padding-left":"opacity","padding-right":"opacity","padding-top":"opacity","page-break-after":{cssPropBits:0,cssLitGroup:[L[42],L[51],L[52],L[53]],cssFns:[]},"page-break-before":"page-break-after","page-break-inside":{cssPropBits:0,cssLitGroup:[L[52],L[53]],cssFns:[]},pause:"border-bottom-left-radius","pause-after":"border-bottom-left-radius","pause-before":"border-bottom-left-radius",perspective:{cssPropBits:5,cssLitGroup:[L[71]],cssFns:[]},"perspective-origin":{cssPropBits:5,cssLitGroup:[L[31],L[42],L[56]],cssFns:[]},pitch:{cssPropBits:5,cssLitGroup:[L[21],L[69]],cssFns:[]},"pitch-range":"border-bottom-left-radius","play-during":{cssPropBits:16,cssLitGroup:[L[52],L[70],L[71],L[74]],cssFns:[]},position:{cssPropBits:0,cssLitGroup:[L[23]],cssFns:[]},quotes:{cssPropBits:8,cssLitGroup:[L[71]],cssFns:[]},resize:{cssPropBits:0,cssLitGroup:[L[39],L[54],L[71]],cssFns:[]},richness:"border-bottom-left-radius",right:"bottom",speak:{cssPropBits:0,cssLitGroup:[L[71],L[72],L[78]],cssFns:[]},"speak-header":{cssPropBits:0,cssLitGroup:[L[51],L[73]],cssFns:[]},"speak-numeral":{cssPropBits:0,cssLitGroup:[L[35]],cssFns:[]},"speak-punctuation":{cssPropBits:0,cssLitGroup:[L[58],L[71]],cssFns:[]},"speech-rate":{cssPropBits:5,cssLitGroup:[L[14],L[69]],cssFns:[]},stress:"border-bottom-left-radius","table-layout":{cssPropBits:0,cssLitGroup:[L[52],L[61]],cssFns:[]},"text-align":{cssPropBits:0,cssLitGroup:[L[42],L[56],L[66]],cssFns:[]},"text-decoration":{cssPropBits:0,cssLitGroup:[L[19],L[71]],cssFns:[]},"text-indent":"border-bottom-left-radius","text-overflow":{cssPropBits:8,cssLitGroup:[L[33]],cssFns:[]},"text-shadow":"box-shadow","text-transform":{cssPropBits:0,cssLitGroup:[L[26],L[71]],cssFns:[]},"text-wrap":{cssPropBits:0,cssLitGroup:[L[46],L[71],L[72]],cssFns:[]},top:"bottom",transform:{cssPropBits:0,cssLitGroup:[L[71]],cssFns:["matrix()","perspective()","rotate()","rotate3d()","rotatex()","rotatey()","rotatez()","scale()","scale3d()","scalex()","scaley()","scalez()","skew()","skewx()","skewy()","translate()","translate3d()","translatex()","translatey()","translatez()"]},"transform-origin":"perspective-origin","transform-style":{cssPropBits:0,cssLitGroup:[L[37]],cssFns:[]},transition:{cssPropBits:1029,cssLitGroup:[L[10],L[48],L[50],L[71]],cssFns:["cubic-bezier()","steps()"]},"transition-delay":"animation-delay","transition-duration":"animation-delay","transition-property":{cssPropBits:1024,cssLitGroup:[L[48],L[50]],cssFns:[]},"transition-timing-function":"animation-timing-function","unicode-bidi":{cssPropBits:0,cssLitGroup:[L[30],L[72]],cssFns:[]},"vertical-align":{cssPropBits:5,cssLitGroup:[L[12],L[31]],cssFns:[]},visibility:"backface-visibility","voice-family":{cssPropBits:8,cssLitGroup:[L[27],L[48]],cssFns:[]},volume:{cssPropBits:1,cssLitGroup:[L[17],L[69]],cssFns:[]},"white-space":{cssPropBits:0,cssLitGroup:[L[22],L[72]],cssFns:[]},width:"min-height","word-break":{cssPropBits:0,cssLitGroup:[L[32],L[72]],cssFns:[]},"word-spacing":"letter-spacing","word-wrap":"overflow-wrap","z-index":"bottom",zoom:"line-height","cubic-bezier()":"animation-delay","steps()":{cssPropBits:5,cssLitGroup:[L[36],L[48]],cssFns:[]},"image()":{cssPropBits:18,cssLitGroup:[L[0],L[48]],cssFns:["rgb()","rgba()"]},"linear-gradient()":{cssPropBits:7,cssLitGroup:[L[0],L[31],L[42],L[48],L[79]],cssFns:["rgb()","rgba()"]},"radial-gradient()":{cssPropBits:7,cssLitGroup:[L[0],L[11],L[31],L[42],L[48],L[56],L[57]],cssFns:["rgb()","rgba()"]},"repeating-linear-gradient()":"linear-gradient()","repeating-radial-gradient()":"radial-gradient()","rgb()":{cssPropBits:1,cssLitGroup:[L[48]],cssFns:[]},"rgba()":"rgb()","rect()":{cssPropBits:5,cssLitGroup:[L[48],L[52]],cssFns:[]},"alpha()":{cssPropBits:1,cssLitGroup:[L[28]],cssFns:[]},"matrix()":"animation-delay","perspective()":"border-bottom-left-radius","rotate()":"border-bottom-left-radius","rotate3d()":"animation-delay","rotatex()":"border-bottom-left-radius","rotatey()":"border-bottom-left-radius","rotatez()":"border-bottom-left-radius","scale()":"animation-delay","scale3d()":"animation-delay","scalex()":"border-bottom-left-radius","scaley()":"border-bottom-left-radius","scalez()":"border-bottom-left-radius","skew()":"animation-delay","skewx()":"border-bottom-left-radius","skewy()":"border-bottom-left-radius","translate()":"animation-delay","translate3d()":"animation-delay","translatex()":"border-bottom-left-radius","translatey()":"border-bottom-left-radius","translatez()":"border-bottom-left-radius"};if(true){for(var key in schema){if("string"===typeof schema[key]&&Object.hasOwnProperty.call(schema,key)){schema[key]=schema[schema[key]]}}}return schema}();if(typeof window!=="undefined"){window["cssSchema"]=cssSchema}var lexCss;var decodeCss;(function(){function decodeCssEscape(s){var i=parseInt(s.substring(1),16);if(i>65535){return i-=65536,String.fromCharCode(55296+(i>>10),56320+(i&1023))}else if(i==i){return String.fromCharCode(i)}else if(s[1]<" "){return""}else{return s[1]}}function escapeCssString(s,replacer){return'"'+s.replace(/[\u0000-\u001f\\\"<>]/g,replacer)+'"'}function escapeCssStrChar(ch){return cssStrChars[ch]||(cssStrChars[ch]="\\"+ch.charCodeAt(0).toString(16)+" ")}function escapeCssUrlChar(ch){return cssUrlChars[ch]||(cssUrlChars[ch]=(ch<""?"%0":"%")+ch.charCodeAt(0).toString(16))}var cssStrChars={"\\":"\\\\"};var cssUrlChars={"\\":"%5c"};var WC="[\\t\\n\\f ]";var W=WC+"*";var NL="[\\n\\f]";var SURROGATE_PAIR="[\\ud800-\\udbff][\\udc00-\\udfff]";var NONASCII="[\\u0080-\\ud7ff\\ue000-\\ufffd]|"+SURROGATE_PAIR;var UNICODE_TAIL="[0-9a-fA-F]{1,6}"+WC+"?";var UNICODE="\\\\"+UNICODE_TAIL;var ESCAPE_TAIL="(?:"+UNICODE_TAIL+"|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|"+SURROGATE_PAIR+")";var ESCAPE="\\\\"+ESCAPE_TAIL;var URLCHAR="(?:[\\t\\x21\\x23-\\x26\\x28-\\x5b\\x5d-\\x7e]|"+NONASCII+"|"+ESCAPE+")";var STRINGCHAR="[^'\"\\n\\f\\\\]|\\\\[\\s\\S]";var STRING="\"(?:'|"+STRINGCHAR+')*"'+"|'(?:\"|"+STRINGCHAR+")*'";var NUM="[-+]?(?:[0-9]+(?:[.][0-9]+)?|[.][0-9]+)";var NMSTART="(?:[a-zA-Z_]|"+NONASCII+"|"+ESCAPE+")";var NMCHAR="(?:[a-zA-Z0-9_-]|"+NONASCII+"|"+ESCAPE+")";var NAME=NMCHAR+"+";var IDENT="-?"+NMSTART+NMCHAR+"*";var ATKEYWORD="@"+IDENT;var HASH="#"+NAME;var NUMBER=NUM;var WORD_TERM="(?:@?-?"+NMSTART+"|#)"+NMCHAR+"*";var PERCENTAGE=NUM+"%";var DIMENSION=NUM+IDENT;var NUMERIC_VALUE=NUM+"(?:%|"+IDENT+")?";var URI="url[(]"+W+"(?:"+STRING+"|"+URLCHAR+"*)"+W+"[)]";var UNICODE_RANGE="U[+][0-9A-F?]{1,6}(?:-[0-9A-F]{1,6})?";var CDO="<!--";var CDC="-->";var S=WC+"+";var COMMENT="/(?:[*][^*]*[*]+(?:[^/][^*]*[*]+)*/|/[^\\n\\f]*)";var FUNCTION="(?!url[(])"+IDENT+"[(]";var INCLUDES="~=";var DASHMATCH="[|]=";var PREFIXMATCH="[^]=";var SUFFIXMATCH="[$]=";var SUBSTRINGMATCH="[*]=";var CMP_OPS="[~|^$*]=";var CHAR="[^\"'\\\\/]|/(?![/*])";var BOM="\\uFEFF";var CSS_TOKEN=new RegExp([BOM,UNICODE_RANGE,URI,FUNCTION,WORD_TERM,STRING,NUMERIC_VALUE,CDO,CDC,S,COMMENT,CMP_OPS,CHAR].join("|"),"gi");var CSS_DECODER=new RegExp("\\\\(?:"+ESCAPE_TAIL+"|"+NL+")","g");var URL_RE=new RegExp("^url\\("+W+"[\"']?|[\"']?"+W+"\\)$","gi");decodeCss=function(css){return css.replace(CSS_DECODER,decodeCssEscape)};lexCss=function(cssText){cssText=""+cssText;var tokens=cssText.replace(/\r\n?/g,"\n").match(CSS_TOKEN)||[];var j=0;var last=" ";for(var i=0,n=tokens.length;i<n;++i){var tok=decodeCss(tokens[i]);var len=tok.length;var cc=tok.charCodeAt(0);tok=cc=='"'.charCodeAt(0)||cc=="'".charCodeAt(0)?escapeCssString(tok.substring(1,len-1),escapeCssStrChar):cc=="/".charCodeAt(0)&&len>1||tok=="\\"||tok==CDC||tok==CDO||tok==""||cc<=" ".charCodeAt(0)?" ":/url\(/i.test(tok)?"url("+escapeCssString(tok.replace(URL_RE,""),escapeCssUrlChar)+")":tok;if(last!=tok||tok!=" "){tokens[j++]=last=tok}}tokens.length=j;return tokens}})();if(typeof window!=="undefined"){window["lexCss"]=lexCss;window["decodeCss"]=decodeCss}var URI=function(){function parse(uriStr){var m=(""+uriStr).match(URI_RE_);if(!m){return null}return new URI(nullIfAbsent(m[1]),nullIfAbsent(m[2]),nullIfAbsent(m[3]),nullIfAbsent(m[4]),nullIfAbsent(m[5]),nullIfAbsent(m[6]),nullIfAbsent(m[7]))}function create(scheme,credentials,domain,port,path,query,fragment){var uri=new URI(encodeIfExists2(scheme,URI_DISALLOWED_IN_SCHEME_OR_CREDENTIALS_),encodeIfExists2(credentials,URI_DISALLOWED_IN_SCHEME_OR_CREDENTIALS_),encodeIfExists(domain),port>0?port.toString():null,encodeIfExists2(path,URI_DISALLOWED_IN_PATH_),null,encodeIfExists(fragment));if(query){if("string"===typeof query){uri.setRawQuery(query.replace(/[^?&=0-9A-Za-z_\-~.%]/g,encodeOne))}else{uri.setAllParameters(query)}}return uri}function encodeIfExists(unescapedPart){if("string"==typeof unescapedPart){return encodeURIComponent(unescapedPart)}return null}function encodeIfExists2(unescapedPart,extra){if("string"==typeof unescapedPart){return encodeURI(unescapedPart).replace(extra,encodeOne)}return null}function encodeOne(ch){var n=ch.charCodeAt(0);return"%"+"0123456789ABCDEF".charAt(n>>4&15)+"0123456789ABCDEF".charAt(n&15)}function normPath(path){return path.replace(/(^|\/)\.(?:\/|$)/g,"$1").replace(/\/{2,}/g,"/")}var PARENT_DIRECTORY_HANDLER=new RegExp(""+"(/|^)"+"(?:[^./][^/]*|\\.{2,}(?:[^./][^/]*)|\\.{3,}[^/]*)"+"/\\.\\.(?:/|$)");var PARENT_DIRECTORY_HANDLER_RE=new RegExp(PARENT_DIRECTORY_HANDLER);var EXTRA_PARENT_PATHS_RE=/^(?:\.\.\/)*(?:\.\.$)?/;function collapse_dots(path){if(path===null){return null}var p=normPath(path);var r=PARENT_DIRECTORY_HANDLER_RE;for(var q;(q=p.replace(r,"$1"))!=p;p=q){}return p}function resolve(baseUri,relativeUri){var absoluteUri=baseUri.clone();var overridden=relativeUri.hasScheme();if(overridden){absoluteUri.setRawScheme(relativeUri.getRawScheme())}else{overridden=relativeUri.hasCredentials()}if(overridden){absoluteUri.setRawCredentials(relativeUri.getRawCredentials())}else{overridden=relativeUri.hasDomain()}if(overridden){absoluteUri.setRawDomain(relativeUri.getRawDomain())}else{overridden=relativeUri.hasPort()}var rawPath=relativeUri.getRawPath();var simplifiedPath=collapse_dots(rawPath);if(overridden){absoluteUri.setPort(relativeUri.getPort());simplifiedPath=simplifiedPath&&simplifiedPath.replace(EXTRA_PARENT_PATHS_RE,"")}else{overridden=!!rawPath;if(overridden){if(simplifiedPath.charCodeAt(0)!==47){var absRawPath=collapse_dots(absoluteUri.getRawPath()||"").replace(EXTRA_PARENT_PATHS_RE,"");var slash=absRawPath.lastIndexOf("/")+1;simplifiedPath=collapse_dots((slash?absRawPath.substring(0,slash):"")+collapse_dots(rawPath)).replace(EXTRA_PARENT_PATHS_RE,"")}}else{simplifiedPath=simplifiedPath&&simplifiedPath.replace(EXTRA_PARENT_PATHS_RE,"");if(simplifiedPath!==rawPath){absoluteUri.setRawPath(simplifiedPath)}}}if(overridden){absoluteUri.setRawPath(simplifiedPath)}else{overridden=relativeUri.hasQuery()}if(overridden){absoluteUri.setRawQuery(relativeUri.getRawQuery())}else{overridden=relativeUri.hasFragment()}if(overridden){absoluteUri.setRawFragment(relativeUri.getRawFragment())}return absoluteUri}function URI(rawScheme,rawCredentials,rawDomain,port,rawPath,rawQuery,rawFragment){this.scheme_=rawScheme;this.credentials_=rawCredentials;this.domain_=rawDomain;this.port_=port;this.path_=rawPath;this.query_=rawQuery;this.fragment_=rawFragment;this.paramCache_=null}URI.prototype.toString=function(){var out=[];if(null!==this.scheme_){out.push(this.scheme_,":")}if(null!==this.domain_){out.push("//");if(null!==this.credentials_){out.push(this.credentials_,"@")}out.push(this.domain_);if(null!==this.port_){out.push(":",this.port_.toString())}}if(null!==this.path_){out.push(this.path_)}if(null!==this.query_){out.push("?",this.query_)}if(null!==this.fragment_){out.push("#",this.fragment_)}return out.join("")};URI.prototype.clone=function(){return new URI(this.scheme_,this.credentials_,this.domain_,this.port_,this.path_,this.query_,this.fragment_)};URI.prototype.getScheme=function(){return this.scheme_&&decodeURIComponent(this.scheme_).toLowerCase()};URI.prototype.getRawScheme=function(){return this.scheme_};URI.prototype.setScheme=function(newScheme){this.scheme_=encodeIfExists2(newScheme,URI_DISALLOWED_IN_SCHEME_OR_CREDENTIALS_);return this};URI.prototype.setRawScheme=function(newScheme){this.scheme_=newScheme?newScheme:null;return this};URI.prototype.hasScheme=function(){return null!==this.scheme_};URI.prototype.getCredentials=function(){return this.credentials_&&decodeURIComponent(this.credentials_)};URI.prototype.getRawCredentials=function(){return this.credentials_};URI.prototype.setCredentials=function(newCredentials){this.credentials_=encodeIfExists2(newCredentials,URI_DISALLOWED_IN_SCHEME_OR_CREDENTIALS_);return this};URI.prototype.setRawCredentials=function(newCredentials){this.credentials_=newCredentials?newCredentials:null;return this};URI.prototype.hasCredentials=function(){return null!==this.credentials_};URI.prototype.getDomain=function(){return this.domain_&&decodeURIComponent(this.domain_)};URI.prototype.getRawDomain=function(){return this.domain_};URI.prototype.setDomain=function(newDomain){return this.setRawDomain(newDomain&&encodeURIComponent(newDomain))};URI.prototype.setRawDomain=function(newDomain){this.domain_=newDomain?newDomain:null;return this.setRawPath(this.path_)};URI.prototype.hasDomain=function(){return null!==this.domain_};URI.prototype.getPort=function(){return this.port_&&decodeURIComponent(this.port_)};URI.prototype.setPort=function(newPort){if(newPort){newPort=Number(newPort);if(newPort!==(newPort&65535)){throw new Error("Bad port number "+newPort)}this.port_=""+newPort}else{this.port_=null}return this};URI.prototype.hasPort=function(){return null!==this.port_};URI.prototype.getPath=function(){return this.path_&&decodeURIComponent(this.path_)};URI.prototype.getRawPath=function(){return this.path_};URI.prototype.setPath=function(newPath){return this.setRawPath(encodeIfExists2(newPath,URI_DISALLOWED_IN_PATH_))};URI.prototype.setRawPath=function(newPath){if(newPath){newPath=String(newPath);this.path_=!this.domain_||/^\//.test(newPath)?newPath:"/"+newPath}else{this.path_=null}return this};URI.prototype.hasPath=function(){return null!==this.path_};URI.prototype.getQuery=function(){return this.query_&&decodeURIComponent(this.query_).replace(/\+/g," ")};URI.prototype.getRawQuery=function(){return this.query_};URI.prototype.setQuery=function(newQuery){this.paramCache_=null;this.query_=encodeIfExists(newQuery);return this};URI.prototype.setRawQuery=function(newQuery){this.paramCache_=null;this.query_=newQuery?newQuery:null;return this};URI.prototype.hasQuery=function(){return null!==this.query_};URI.prototype.setAllParameters=function(params){if(typeof params==="object"){if(!(params instanceof Array)&&(params instanceof Object||Object.prototype.toString.call(params)!=="[object Array]")){var newParams=[];var i=-1;for(var k in params){var v=params[k];if("string"===typeof v){newParams[++i]=k;newParams[++i]=v}}params=newParams}}this.paramCache_=null;var queryBuf=[];var separator="";for(var j=0;j<params.length;){var k=params[j++];var v=params[j++];queryBuf.push(separator,encodeURIComponent(k.toString()));separator="&";if(v){queryBuf.push("=",encodeURIComponent(v.toString()))}}this.query_=queryBuf.join("");return this};URI.prototype.checkParameterCache_=function(){if(!this.paramCache_){var q=this.query_;if(!q){this.paramCache_=[]}else{var cgiParams=q.split(/[&\?]/);var out=[];var k=-1;for(var i=0;i<cgiParams.length;++i){var m=cgiParams[i].match(/^([^=]*)(?:=(.*))?$/);out[++k]=decodeURIComponent(m[1]).replace(/\+/g," ");out[++k]=decodeURIComponent(m[2]||"").replace(/\+/g," ")}this.paramCache_=out}}};URI.prototype.setParameterValues=function(key,values){if(typeof values==="string"){values=[values]}this.checkParameterCache_();var newValueIndex=0;var pc=this.paramCache_;var params=[];for(var i=0,k=0;i<pc.length;i+=2){if(key===pc[i]){if(newValueIndex<values.length){params.push(key,values[newValueIndex++])}}else{params.push(pc[i],pc[i+1])}}while(newValueIndex<values.length){params.push(key,values[newValueIndex++])}this.setAllParameters(params);return this};URI.prototype.removeParameter=function(key){return this.setParameterValues(key,[])};URI.prototype.getAllParameters=function(){this.checkParameterCache_();return this.paramCache_.slice(0,this.paramCache_.length)};URI.prototype.getParameterValues=function(paramNameUnescaped){this.checkParameterCache_();var values=[];for(var i=0;i<this.paramCache_.length;i+=2){if(paramNameUnescaped===this.paramCache_[i]){values.push(this.paramCache_[i+1])}}return values};URI.prototype.getParameterMap=function(paramNameUnescaped){this.checkParameterCache_();var paramMap={};for(var i=0;i<this.paramCache_.length;i+=2){var key=this.paramCache_[i++],value=this.paramCache_[i++];if(!(key in paramMap)){paramMap[key]=[value]}else{paramMap[key].push(value)}}return paramMap};URI.prototype.getParameterValue=function(paramNameUnescaped){this.checkParameterCache_();for(var i=0;i<this.paramCache_.length;i+=2){if(paramNameUnescaped===this.paramCache_[i]){return this.paramCache_[i+1]}}return null};URI.prototype.getFragment=function(){return this.fragment_&&decodeURIComponent(this.fragment_)};URI.prototype.getRawFragment=function(){return this.fragment_};URI.prototype.setFragment=function(newFragment){this.fragment_=newFragment?encodeURIComponent(newFragment):null;return this};URI.prototype.setRawFragment=function(newFragment){this.fragment_=newFragment?newFragment:null;return this};URI.prototype.hasFragment=function(){return null!==this.fragment_};function nullIfAbsent(matchPart){return"string"==typeof matchPart&&matchPart.length>0?matchPart:null}var URI_RE_=new RegExp("^"+"(?:"+"([^:/?#]+)"+":)?"+"(?://"+"(?:([^/?#]*)@)?"+"([^/?#:@]*)"+"(?::([0-9]+))?"+")?"+"([^?#]+)?"+"(?:\\?([^#]*))?"+"(?:#(.*))?"+"$");var URI_DISALLOWED_IN_SCHEME_OR_CREDENTIALS_=/[#\/\?@]/g;var URI_DISALLOWED_IN_PATH_=/[\#\?]/g;URI.parse=parse;URI.create=create;URI.resolve=resolve;URI.collapse_dots=collapse_dots;URI.utils={mimeTypeOf:function(uri){var uriObj=parse(uri);if(/\.html$/.test(uriObj.getPath())){return"text/html"}else{return"application/javascript"}},resolve:function(base,uri){if(base){return resolve(parse(base),parse(uri)).toString()}else{return""+uri}}};return URI}();if(typeof window!=="undefined"){window["URI"]=URI}var sanitizeCssProperty=undefined;var sanitizeCssSelectorList=undefined;var sanitizeStylesheet=undefined;var sanitizeStylesheetWithExternals=undefined;var sanitizeMediaQuery=undefined;(function(){var NOEFFECT_URL='url("about:blank")';var NORM_URL_REGEXP=/[\n\f\r\"\'()*<>]/g;var NORM_URL_REPLACEMENTS={"\n":"%0a","\f":"%0c","\r":"%0d",'"':"%22","'":"%27","(":"%28",")":"%29","*":"%2a","<":"%3c",">":"%3e"};function normalizeUrl(s){if("string"===typeof s){return'url("'+s.replace(NORM_URL_REGEXP,normalizeUrlChar)+'")'}else{return NOEFFECT_URL}}function normalizeUrlChar(ch){return NORM_URL_REPLACEMENTS[ch]}var URI_SCHEME_RE=new RegExp("^"+"(?:"+"([^:/?# ]+)"+":)?");var ALLOWED_URI_SCHEMES=/^(?:https?|mailto)$/i;function resolveUri(baseUri,uri){if(baseUri){return URI.utils.resolve(baseUri,uri)}return uri}function safeUri(uri,prop,naiveUriRewriter){if(!naiveUriRewriter){return null}var parsed=(""+uri).match(URI_SCHEME_RE);if(parsed&&(!parsed[1]||ALLOWED_URI_SCHEMES.test(parsed[1]))){return naiveUriRewriter(uri,prop)}else{return null}}function withoutVendorPrefix(ident){return ident.replace(/^-(?:apple|css|epub|khtml|moz|mso?|o|rim|wap|webkit|xv)-(?=[a-z])/,"")}sanitizeCssProperty=function(){function unionArrays(arrs){var map={};for(var i=arrs.length;--i>=0;){var arr=arrs[i];for(var j=arr.length;--j>=0;){map[arr[j]]=ALLOWED_LITERAL}}return map}var ALLOWED_LITERAL={};return function sanitize(property,tokens,opt_naiveUriRewriter,opt_baseUri,opt_idSuffix){var propertyKey=withoutVendorPrefix(property);var propertySchema=cssSchema[propertyKey];if(!propertySchema||"object"!==typeof propertySchema){tokens.length=0;return}var propBits=propertySchema["cssPropBits"];function sanitizeFunctionCall(tokens,start){var parenDepth=1,end=start+1,n=tokens.length;while(end<n&&parenDepth){var token=tokens[end++];parenDepth+=token===")"?-1:/^[^"']*\($/.test(token)}if(!parenDepth){var fnToken=tokens[start].toLowerCase();var bareFnToken=withoutVendorPrefix(fnToken);var fnTokens=tokens.splice(start,end-start,"");var fns=propertySchema["cssFns"];for(var i=0,nFns=fns.length;i<nFns;++i){if(fns[i].substring(0,bareFnToken.length)==bareFnToken){fnTokens[0]=fnTokens[fnTokens.length-1]="";sanitize(fns[i],fnTokens,opt_naiveUriRewriter,opt_baseUri);return fnToken+fnTokens.join(" ")+")"}}}return""}var stringDisposition=propBits&(CSS_PROP_BIT_URL|CSS_PROP_BIT_UNRESERVED_WORD);var identDisposition=propBits&(CSS_PROP_BIT_GLOBAL_NAME|CSS_PROP_BIT_PROPERTY_NAME);var lastQuoted=NaN;var i=0,k=0;for(;i<tokens.length;++i){var token=tokens[i].toLowerCase();var cc=token.charCodeAt(0),cc1,cc2,isnum1,isnum2,end;var litGroup,litMap;token=cc===" ".charCodeAt(0)?"":cc==='"'.charCodeAt(0)?stringDisposition===CSS_PROP_BIT_URL?opt_naiveUriRewriter?normalizeUrl(safeUri(resolveUri(opt_baseUri,decodeCss(tokens[i].substring(1,token.length-1))),propertyKey,opt_naiveUriRewriter)):"":propBits&CSS_PROP_BIT_QSTRING&&!(stringDisposition&stringDisposition-1)?token:"":token==="inherit"?token:(litGroup=propertySchema["cssLitGroup"],litMap=litGroup?propertySchema["cssLitMap"]||(propertySchema["cssLitMap"]=unionArrays(litGroup)):ALLOWED_LITERAL,litMap[withoutVendorPrefix(token)]===ALLOWED_LITERAL)?token:cc==="#".charCodeAt(0)&&/^#(?:[0-9a-f]{3}){1,2}$/.test(token)?propBits&CSS_PROP_BIT_HASH_VALUE?token:"":"0".charCodeAt(0)<=cc&&cc<="9".charCodeAt(0)?propBits&CSS_PROP_BIT_QUANTITY?token:"":(cc1=token.charCodeAt(1),cc2=token.charCodeAt(2),isnum1="0".charCodeAt(0)<=cc1&&cc1<="9".charCodeAt(0),isnum2="0".charCodeAt(0)<=cc2&&cc2<="9".charCodeAt(0),cc==="+".charCodeAt(0)&&(isnum1||cc1===".".charCodeAt(0)&&isnum2))?propBits&CSS_PROP_BIT_QUANTITY?(isnum1?"":"0")+token.substring(1):"":cc==="-".charCodeAt(0)&&(isnum1||cc1===".".charCodeAt(0)&&isnum2)?propBits&CSS_PROP_BIT_NEGATIVE_QUANTITY?(isnum1?"-":"-0")+token.substring(1):propBits&CSS_PROP_BIT_QUANTITY?"0":"":cc===".".charCodeAt(0)&&isnum1?propBits&CSS_PROP_BIT_QUANTITY?"0"+token:"":'url("'===token.substring(0,5)?opt_naiveUriRewriter&&propBits&CSS_PROP_BIT_URL?normalizeUrl(safeUri(resolveUri(opt_baseUri,tokens[i].substring(5,token.length-2)),propertyKey,opt_naiveUriRewriter)):"":token.charAt(token.length-1)==="("?sanitizeFunctionCall(tokens,i):identDisposition&&/^-?[a-z_][\w\-]*$/.test(token)&&!/__$/.test(token)?opt_idSuffix&&identDisposition===CSS_PROP_BIT_GLOBAL_NAME?tokens[i]+opt_idSuffix:identDisposition===CSS_PROP_BIT_PROPERTY_NAME&&cssSchema[token]&&"number"===typeof cssSchema[token].cssPropBits?token:"":/^\w+$/.test(token)&&stringDisposition===CSS_PROP_BIT_UNRESERVED_WORD&&propBits&CSS_PROP_BIT_QSTRING?lastQuoted+1===k?(tokens[lastQuoted]=tokens[lastQuoted].substring(0,tokens[lastQuoted].length-1)+" "+token+'"',token=""):(lastQuoted=k,'"'+token+'"'):"";</span> <span class='diff-add'>if(token){tokens[k++]=token}}if(k===1&&tokens[0]===NOEFFECT_URL){k=0}tokens.length=k}}();var PSEUDO_SELECTOR_WHITELIST=new RegExp("^(active|after|before|blank|checked|default|disabled"+"|drop|empty|enabled|first|first-child|first-letter"+"|first-line|first-of-type|fullscreen|focus|hover"+"|in-range|indeterminate|invalid|last-child|last-of-type"+"|left|link|only-child|only-of-type|optional|out-of-range"+"|placeholder-shown|read-only|read-write|required|right"+"|root|scope|user-error|valid|visited"+")$");var COMBINATOR={};COMBINATOR[">"]=COMBINATOR["+"]=COMBINATOR["~"]=COMBINATOR;sanitizeCssSelectorList=function(selectors,virtualization,opt_onUntranslatableSelector){var containerClass=virtualization.containerClass;var idSuffix=virtualization.idSuffix;var tagPolicy=virtualization.tagPolicy;var sanitized=[];var k=0,i,inBrackets=0,tok;for(i=0;i<selectors.length;++i){tok=selectors[i];if(tok=="("||tok=="["?(++inBrackets,true):tok==")"||tok=="]"?(inBrackets&&--inBrackets,true):!(selectors[i]==" "&&(inBrackets||COMBINATOR[selectors[i-1]]===COMBINATOR||COMBINATOR[selectors[i+1]]===COMBINATOR))){selectors[k++]=selectors[i]}}selectors.length=k;var n=selectors.length,start=0;for(i=0;i<n;++i){if(selectors[i]===","){if(!processComplexSelector(start,i)){return null}start=i+1}}if(!processComplexSelector(start,n)){return null}function processComplexSelector(start,end){if(selectors[start]===" "){++start}if(end-1!==start&&selectors[end]===" "){--end}var out=[];var lastOperator=start;var valid=true;for(var i=start;valid&&i<end;++i){var tok=selectors[i];if(COMBINATOR[tok]===COMBINATOR||tok===" "){if(!processCompoundSelector(lastOperator,i,tok)){valid=false}else{lastOperator=i+1}}}if(!processCompoundSelector(lastOperator,end,"")){valid=false}function processCompoundSelector(start,end,combinator){var element,classId,attrs,pseudoSelector,tok,valid=true;element="";if(start<end){tok=selectors[start];if(tok==="*"){++start;element=tok}else if(/^[a-zA-Z]/.test(tok)){var decision=tagPolicy(tok.toLowerCase(),[]);if(decision){if("tagName"in decision){tok=decision["tagName"]}++start;element=tok}}}classId="";attrs="";pseudoSelector="";for(;valid&&start<end;++start){tok=selectors[start];if(tok.charAt(0)==="#"){if(/^#_|__$|[^\w#:\-]/.test(tok)){valid=false}else{classId+=tok+idSuffix}}else if(tok==="."){if(++start<end&&/^[0-9A-Za-z:_\-]+$/.test(tok=selectors[start])&&!/^_|__$/.test(tok)){classId+="."+tok}else{valid=false}}else if(start+1<end&&selectors[start]==="["){++start;var vAttr=selectors[start++].toLowerCase();var atype=html4.ATTRIBS[element+"::"+vAttr];if(atype!==+atype){atype=html4.ATTRIBS["*::"+vAttr]}var rAttr;if(virtualization.virtualizeAttrName){rAttr=virtualization.virtualizeAttrName(element,vAttr);if(typeof rAttr!=="string"){valid=false;rAttr=vAttr}if(valid&&atype!==+atype){atype=html4.atype["NONE"]}}else{rAttr=vAttr;if(atype!==+atype){valid=false}}var op="",value="",ignoreCase=false;if(/^[~^$*|]?=$/.test(selectors[start])){op=selectors[start++];value=selectors[start++];if(/^[0-9A-Za-z:_\-]+$/.test(value)){value='"'+value+'"'}else if(value==="]"){value='""';--start}if(!/^"([^\"\\]|\\.)*"$/.test(value)){valid=false}ignoreCase=selectors[start]==="i";if(ignoreCase){++start}}if(selectors[start]!=="]"){++start;valid=false}switch(atype){case html4.atype["CLASSES"]:case html4.atype["LOCAL_NAME"]:case html4.atype["NONE"]:break;case html4.atype["GLOBAL_NAME"]:case html4.atype["ID"]:case html4.atype["IDREF"]:if((op==="="||op==="~="||op==="$=")&&value!='""'&&!ignoreCase){value='"'+value.substring(1,value.length-1)+idSuffix+'"'}else if(op==="|="||op===""){}else{valid=false}break;case html4.atype["URI"]:case html4.atype["URI_FRAGMENT"]:if(op!==""){valid=false}break;default:valid=false}if(valid){attrs+="["+rAttr.replace(/[^\w-]/g,"\\$&")+op+value+(ignoreCase?" i]":"]")}}else if(start<end&&selectors[start]===":"){tok=selectors[++start];if(PSEUDO_SELECTOR_WHITELIST.test(tok)){pseudoSelector+=":"+tok}else{break}}else{break}}if(start!==end){valid=false}if(valid){var selector=(element+classId).replace(/[^ .*#\w-]/g,"\\$&")+attrs+pseudoSelector+combinator;if(selector){out.push(selector)}}return valid}if(valid){if(out.length){var safeSelector=out.join("");if(containerClass!==null){safeSelector="."+containerClass+" "+safeSelector}sanitized.push(safeSelector)}return true}else{return!opt_onUntranslatableSelector||opt_onUntranslatableSelector(selectors.slice(start,end))}}return sanitized};(function(){var MEDIA_TYPE="(?:"+"all|aural|braille|embossed|handheld|print"+"|projection|screen|speech|tty|tv"+")";var MEDIA_FEATURE="(?:"+"(?:min-|max-)?"+"(?:"+("(?:device-)?"+"(?:aspect-ratio|height|width)"+"|color(?:-index)?"+"|monochrome"+"|orientation"+"|resolution")+")"+"|grid"+"|hover"+"|luminosity"+"|pointer"+"|scan"+"|script"+")";var LENGTH_UNIT="(?:p[cxt]|[cem]m|in|dpi|dppx|dpcm|%)";var CSS_VALUE="-?(?:"+"[a-z]\\w+(?:-\\w+)*"+"|\\d+(?: / \\d+|(?:\\.\\d+)?"+LENGTH_UNIT+"?)"+")";var MEDIA_EXPR="\\( "+MEDIA_FEATURE+" (?:"+": "+CSS_VALUE+" )?\\)";var MEDIA_QUERY="(?:"+"(?:(?:(?:only|not) )?"+MEDIA_TYPE+"|"+MEDIA_EXPR+")"+"(?: and ?"+MEDIA_EXPR+")*"+")";var STARTS_WITH_KEYWORD_REGEXP=/^\w/;var MEDIA_QUERY_LIST_REGEXP=new RegExp("^"+MEDIA_QUERY+"(?: , "+MEDIA_QUERY+")*"+"$","i");sanitizeMediaQuery=function(cssTokens){cssTokens=cssTokens.slice();var nTokens=cssTokens.length,k=0;for(var i=0;i<nTokens;++i){var tok=cssTokens[i];if(tok!=" "){cssTokens[k++]=tok}}cssTokens.length=k;var css=cssTokens.join(" ");css=!css.length?"":!MEDIA_QUERY_LIST_REGEXP.test(css)?"not all":STARTS_WITH_KEYWORD_REGEXP.test(css)?css:"not all , "+css;return css}})();(function(){function cssParseUri(candidate){var string1=/^\s*["]([^"]*)["]\s*$/;var string2=/^\s*[']([^']*)[']\s*$/;var url1=/^\s*url\s*[(]["]([^"]*)["][)]\s*$/;var url2=/^\s*url\s*[(][']([^']*)['][)]\s*$/;var url3=/^\s*url\s*[(]([^)]*)[)]\s*$/;var match;if(match=string1.exec(candidate)){return match[1]}else if(match=string2.exec(candidate)){return match[1]}else if(match=url1.exec(candidate)){return match[1]}else if(match=url2.exec(candidate)){return match[1]}else if(match=url3.exec(candidate)){return match[1]}return null}function sanitizeStylesheetInternal(baseUri,cssText,virtualization,naiveUriRewriter,naiveUriFetcher,continuation,opt_importCount){var safeCss=void 0;var importCount=opt_importCount||[0];var blockStack=[];var elide=false;parseCssStylesheet(cssText,{startStylesheet:function(){safeCss=[]},endStylesheet:function(){},startAtrule:function(atIdent,headerArray){if(elide){atIdent=null}else if(atIdent==="@media"){safeCss.push("@media"," ",sanitizeMediaQuery(headerArray))}else if(atIdent==="@keyframes"||atIdent==="@-webkit-keyframes"){var animationId=headerArray[0];if(headerArray.length===1&&!/__$|[^\w\-]/.test(animationId)){safeCss.push(atIdent," ",animationId+virtualization.idSuffix);atIdent="@keyframes"}else{atIdent=null}}else{if(atIdent==="@import"&&headerArray.length>0){atIdent=null;if("function"===typeof continuation){var mediaQuery=sanitizeMediaQuery(headerArray.slice(1));if(mediaQuery!=="not all"){++importCount[0];var placeholder=[];safeCss.push(placeholder);var cssUrl=safeUri(resolveUri(baseUri,cssParseUri(headerArray[0])),function(result){var sanitized=sanitizeStylesheetInternal(cssUrl,result.html,virtualization,naiveUriRewriter,naiveUriFetcher,continuation,importCount);--importCount[0];var safeImportedCss=mediaQuery?{toString:function(){return"@media "+mediaQuery+" {"+sanitized.result+"}"}}:sanitized.result;placeholder[0]=safeImportedCss;continuation(safeImportedCss,!!importCount[0])},naiveUriFetcher)}}else{if(window.console){window.console.log("@import "+headerArray.join(" ")+" elided")}}}}elide=!atIdent;blockStack.push(atIdent)},endAtrule:function(){blockStack.pop();if(!elide){safeCss.push(";")}checkElide()},startBlock:function(){if(!elide){safeCss.push("{")}},endBlock:function(){if(!elide){safeCss.push("}");elide=true}},startRuleset:function(selectorArray){if(!elide){var selector=void 0;if(blockStack[blockStack.length-1]==="@keyframes"){selector=selectorArray.join(" ").match(/^ *(?:from|to|\d+(?:\.\d+)?%) *(?:, *(?:from|to|\d+(?:\.\d+)?%) *)*$/i);elide=!selector;if(selector){selector=selector[0].replace(/ +/g,"")}}else{var selectors=sanitizeCssSelectorList(selectorArray,virtualization);if(!selectors||!selectors.length){elide=true}else{selector=selectors.join(", ")}}if(!elide){safeCss.push(selector,"{")}}blockStack.push(null)},endRuleset:function(){blockStack.pop();if(!elide){safeCss.push("}")}checkElide()},declaration:function(property,valueArray){if(!elide){var isImportant=false;var nValues=valueArray.length;if(nValues>=2&&valueArray[nValues-2]==="!"&&valueArray[nValues-1].toLowerCase()==="important"){isImportant=true;valueArray.length-=2}sanitizeCssProperty(property,valueArray,naiveUriRewriter,baseUri,virtualization.idSuffix);if(valueArray.length){safeCss.push(property,":",valueArray.join(" "),isImportant?" !important;":";")}}}});function checkElide(){elide=blockStack.length&&blockStack[blockStack.length-1]===null}return{result:{toString:function(){return safeCss.join("")}},moreToCome:!!importCount[0]}}sanitizeStylesheet=function(baseUri,cssText,virtualization,naiveUriRewriter){return sanitizeStylesheetInternal(baseUri,cssText,virtualization,naiveUriRewriter,undefined,undefined).result.toString()};sanitizeStylesheetWithExternals=function(baseUri,cssText,virtualization,naiveUriRewriter,naiveUriFetcher,continuation){return sanitizeStylesheetInternal(baseUri,cssText,virtualization,naiveUriRewriter,naiveUriFetcher,continuation)}})()})();if(typeof window!=="undefined"){window["sanitizeCssProperty"]=sanitizeCssProperty;window["sanitizeCssSelectorList"]=sanitizeCssSelectorList;window["sanitizeStylesheet"]=sanitizeStylesheet;window["sanitizeMediaQuery"]=sanitizeMediaQuery}if("I".toLowerCase()!=="i"){throw"I/i problem"}var parseCssStylesheet;var parseCssDeclarations;(function(){parseCssStylesheet=function(cssText,handler){var toks=lexCss(cssText);if(handler["startStylesheet"]){handler["startStylesheet"]()}for(var i=0,n=toks.length;i<n;){i=toks[i]===" "?i+1:statement(toks,i,n,handler)}if(handler["endStylesheet"]){handler["endStylesheet"]()}};function statement(toks,i,n,handler){if(i<n){var tok=toks[i];if(tok.charAt(0)==="@"){return atrule(toks,i,n,handler,true)}else{return ruleset(toks,i,n,handler)}}else{return i}}function atrule(toks,i,n,handler,blockok){var start=i++;while(i<n&&toks[i]!=="{"&&toks[i]!==";"){++i}if(i<n&&(blockok||toks[i]===";")){var s=start+1,e=i;if(s<n&&toks[s]===" "){++s}if(e>s&&toks[e-1]===" "){--e}if(handler["startAtrule"]){handler["startAtrule"](toks[start].toLowerCase(),toks.slice(s,e))}i=toks[i]==="{"?block(toks,i,n,handler):i+1;if(handler["endAtrule"]){handler["endAtrule"]()}}return i}function block(toks,i,n,handler){++i;if(handler["startBlock"]){handler["startBlock"]()}while(i<n){var ch=toks[i].charAt(0);if(ch=="}"){++i;break}if(ch===" "||ch===";"){i=i+1}else if(ch==="@"){i=atrule(toks,i,n,handler,false)}else if(ch==="{"){i=block(toks,i,n,handler)}else{i=ruleset(toks,i,n,handler)}}if(handler["endBlock"]){handler["endBlock"]()}return i}function ruleset(toks,i,n,handler){var s=i,e=selector(toks,i,n,true);if(e<0){e=~e;return e===s?e+1:e}var tok=toks[e];if(tok!=="{"){return e===s?e+1:e}i=e+1;if(e>s&&toks[e-1]===" "){--e}if(handler["startRuleset"]){handler["startRuleset"](toks.slice(s,e))}while(i<n){tok=toks[i];if(tok==="}"){++i;break}if(tok===" "){i=i+1}else{i=declaration(toks,i,n,handler)}}if(handler["endRuleset"]){handler["endRuleset"]()}return i}function selector(toks,i,n,allowSemi){var s=i;var tok;var brackets=[],stackLast=-1;for(;i<n;++i){tok=toks[i].charAt(0);if(tok==="["||tok==="("){brackets[++stackLast]=tok}else if(tok==="]"&&brackets[stackLast]==="["||tok===")"&&brackets[stackLast]==="("){--stackLast}else if(tok==="{"||tok==="}"||tok===";"||tok==="@"||tok===":"&&!allowSemi){break}}if(stackLast>=0){i=~(i+1)}return i}var ident=/^-?[a-z]/i;function skipDeclaration(toks,i,n){while(i<n&&toks[i]!==";"&&toks[i]!=="}"){++i}return i<n&&toks[i]===";"?i+1:i}function declaration(toks,i,n,handler){var property=toks[i++];if(!ident.test(property)){return skipDeclaration(toks,i,n)}var tok;if(i<n&&toks[i]===" "){++i}if(i==n||toks[i]!==":"){return skipDeclaration(toks,i,n)}++i;if(i<n&&toks[i]===" "){++i}var s=i,e=selector(toks,i,n,false);if(e<0){e=~e}else{var value=[],valuelen=0;for(var j=s;j<e;++j){tok=toks[j];if(tok!==" "){value[valuelen++]=tok}}if(e<n){do{tok=toks[e];if(tok===";"||tok==="}"){break}valuelen=0}while(++e<n);if(tok===";"){++e}}if(valuelen&&handler["declaration"]){handler["declaration"](property.toLowerCase(),value)}}return e}parseCssDeclarations=function(cssText,handler){var toks=lexCss(cssText);for(var i=0,n=toks.length;i<n;){i=toks[i]!==" "?declaration(toks,i,n,handler):i+1}}})();if(typeof window!=="undefined"){window["parseCssStylesheet"]=parseCssStylesheet;window["parseCssDeclarations"]=parseCssDeclarations}var html4={};html4.atype={NONE:0,URI:1,URI_FRAGMENT:11,SCRIPT:2,STYLE:3,HTML:12,ID:4,IDREF:5,IDREFS:6,GLOBAL_NAME:7,LOCAL_NAME:8,CLASSES:9,FRAME_TARGET:10,MEDIA_QUERY:13};html4["atype"]=html4.atype;html4.ATTRIBS={"*::class":9,"*::dir":0,"*::draggable":0,"*::hidden":0,"*::id":4,"*::inert":0,"*::itemprop":0,"*::itemref":6,"*::itemscope":0,"*::lang":0,"*::onblur":2,"*::onchange":2,"*::onclick":2,"*::ondblclick":2,"*::onerror":2,"*::onfocus":2,"*::onkeydown":2,"*::onkeypress":2,"*::onkeyup":2,"*::onload":2,"*::onmousedown":2,"*::onmousemove":2,"*::onmouseout":2,"*::onmouseover":2,"*::onmouseup":2,"*::onreset":2,"*::onscroll":2,"*::onselect":2,"*::onsubmit":2,"*::ontouchcancel":2,"*::ontouchend":2,"*::ontouchenter":2,"*::ontouchleave":2,"*::ontouchmove":2,"*::ontouchstart":2,"*::onunload":2,"*::spellcheck":0,"*::style":3,"*::title":0,"*::translate":0,"a::accesskey":0,"a::coords":0,"a::href":1,"a::hreflang":0,"a::name":7,"a::onblur":2,"a::onfocus":2,"a::shape":0,"a::tabindex":0,"a::target":10,"a::type":0,"area::accesskey":0,"area::alt":0,"area::coords":0,"area::href":1,"area::nohref":0,"area::onblur":2,"area::onfocus":2,"area::shape":0,"area::tabindex":0,"area::target":10,"audio::controls":0,"audio::loop":0,"audio::mediagroup":5,"audio::muted":0,"audio::preload":0,"audio::src":1,"bdo::dir":0,"blockquote::cite":1,"br::clear":0,"button::accesskey":0,"button::disabled":0,"button::name":8,"button::onblur":2,"button::onfocus":2,"button::tabindex":0,"button::type":0,"button::value":0,"canvas::height":0,"canvas::width":0,"caption::align":0,"col::align":0,"col::char":0,"col::charoff":0,"col::span":0,"col::valign":0,"col::width":0,"colgroup::align":0,"colgroup::char":0,"colgroup::charoff":0,"colgroup::span":0,"colgroup::valign":0,"colgroup::width":0,"command::checked":0,"command::command":5,"command::disabled":0,"command::icon":1,"command::label":0,"command::radiogroup":0,"command::type":0,"data::value":0,"del::cite":1,"del::datetime":0,"details::open":0,"dir::compact":0,"div::align":0,"dl::compact":0,"fieldset::disabled":0,"font::color":0,"font::face":0,"font::size":0,"form::accept":0,"form::action":1,"form::autocomplete":0,"form::enctype":0,"form::method":0,"form::name":7,"form::novalidate":0,"form::onreset":2,"form::onsubmit":2,"form::target":10,"h1::align":0,"h2::align":0,"h3::align":0,"h4::align":0,"h5::align":0,"h6::align":0,"hr::align":0,"hr::noshade":0,"hr::size":0,"hr::width":0,"iframe::align":0,"iframe::frameborder":0,"iframe::height":0,"iframe::marginheight":0,"iframe::marginwidth":0,"iframe::width":0,"img::align":0,"img::alt":0,"img::border":0,"img::height":0,"img::hspace":0,"img::ismap":0,"img::name":7,"img::src":1,"img::usemap":11,"img::vspace":0,"img::width":0,"input::accept":0,"input::accesskey":0,"input::align":0,"input::alt":0,"input::autocomplete":0,"input::checked":0,"input::disabled":0,"input::inputmode":0,"input::ismap":0,"input::list":5,"input::max":0,"input::maxlength":0,"input::min":0,"input::multiple":0,"input::name":8,"input::onblur":2,"input::onchange":2,"input::onfocus":2,"input::onselect":2,"input::placeholder":0,"input::readonly":0,"input::required":0,"input::size":0,"input::src":1,"input::step":0,"input::tabindex":0,"input::type":0,"input::usemap":11,"input::value":0,"ins::cite":1,"ins::datetime":0,"label::accesskey":0,"label::for":5,"label::onblur":2,"label::onfocus":2,"legend::accesskey":0,"legend::align":0,"li::type":0,"li::value":0,"map::name":7,"menu::compact":0,"menu::label":0,"menu::type":0,"meter::high":0,"meter::low":0,"meter::max":0,"meter::min":0,"meter::value":0,"ol::compact":0,"ol::reversed":0,"ol::start":0,"ol::type":0,"optgroup::disabled":0,"optgroup::label":0,"option::disabled":0,"option::label":0,"option::selected":0,"option::value":0,"output::for":6,"output::name":8,"p::align":0,"pre::width":0,"progress::max":0,"progress::min":0,"progress::value":0,"q::cite":1,"select::autocomplete":0,"select::disabled":0,"select::multiple":0,"select::name":8,"select::onblur":2,"select::onchange":2,"select::onfocus":2,"select::required":0,"select::size":0,"select::tabindex":0,"source::type":0,"table::align":0,"table::bgcolor":0,"table::border":0,"table::cellpadding":0,"table::cellspacing":0,"table::frame":0,"table::rules":0,"table::summary":0,"table::width":0,"tbody::align":0,"tbody::char":0,"tbody::charoff":0,"tbody::valign":0,"td::abbr":0,"td::align":0,"td::axis":0,"td::bgcolor":0,"td::char":0,"td::charoff":0,"td::colspan":0,"td::headers":6,"td::height":0,"td::nowrap":0,"td::rowspan":0,"td::scope":0,"td::valign":0,"td::width":0,"textarea::accesskey":0,"textarea::autocomplete":0,"textarea::cols":0,"textarea::disabled":0,"textarea::inputmode":0,"textarea::name":8,"textarea::onblur":2,"textarea::onchange":2,"textarea::onfocus":2,"textarea::onselect":2,"textarea::placeholder":0,"textarea::readonly":0,"textarea::required":0,"textarea::rows":0,"textarea::tabindex":0,"textarea::wrap":0,"tfoot::align":0,"tfoot::char":0,"tfoot::charoff":0,"tfoot::valign":0,"th::abbr":0,"th::align":0,"th::axis":0,"th::bgcolor":0,"th::char":0,"th::charoff":0,"th::colspan":0,"th::headers":6,"th::height":0,"th::nowrap":0,"th::rowspan":0,"th::scope":0,"th::valign":0,"th::width":0,"thead::align":0,"thead::char":0,"thead::charoff":0,"thead::valign":0,"tr::align":0,"tr::bgcolor":0,"tr::char":0,"tr::charoff":0,"tr::valign":0,"track::default":0,"track::kind":0,"track::label":0,"track::srclang":0,"ul::compact":0,"ul::type":0,"video::controls":0,"video::height":0,"video::loop":0,"video::mediagroup":5,"video::muted":0,"video::poster":1,"video::preload":0,"video::src":1,"video::width":0};html4["ATTRIBS"]=html4.ATTRIBS;html4.eflags={OPTIONAL_ENDTAG:1,EMPTY:2,CDATA:4,RCDATA:8,UNSAFE:16,FOLDABLE:32,SCRIPT:64,STYLE:128,VIRTUALIZED:256};html4["eflags"]=html4.eflags;html4.ELEMENTS={a:0,abbr:0,acronym:0,address:0,applet:272,area:2,article:0,aside:0,audio:0,b:0,base:274,basefont:274,bdi:0,bdo:0,big:0,blockquote:0,body:305,br:2,button:0,canvas:0,caption:0,center:0,cite:0,code:0,col:2,colgroup:1,command:2,data:0,datalist:0,dd:1,del:0,details:0,dfn:0,dialog:272,dir:0,div:0,dl:0,dt:1,em:0,fieldset:0,figcaption:0,figure:0,font:0,footer:0,form:0,frame:274,frameset:272,h1:0,h2:0,h3:0,h4:0,h5:0,h6:0,head:305,header:0,hgroup:0,hr:2,html:305,i:0,iframe:4,img:2,input:2,ins:0,isindex:274,kbd:0,keygen:274,label:0,legend:0,li:1,link:274,map:0,mark:0,menu:0,meta:274,meter:0,nav:0,nobr:0,noembed:276,noframes:276,noscript:276,object:272,ol:0,optgroup:0,option:1,output:0,p:1,param:274,pre:0,progress:0,q:0,s:0,samp:0,script:84,section:0,select:0,small:0,source:2,span:0,strike:0,strong:0,style:148,sub:0,summary:0,sup:0,table:0,tbody:1,td:1,textarea:8,tfoot:1,th:1,thead:1,time:0,title:280,tr:1,track:2,tt:0,u:0,ul:0,"var":0,video:0,wbr:2};html4["ELEMENTS"]=html4.ELEMENTS;html4.ELEMENT_DOM_INTERFACES={a:"HTMLAnchorElement",abbr:"HTMLElement",acronym:"HTMLElement",address:"HTMLElement",applet:"HTMLAppletElement",area:"HTMLAreaElement",article:"HTMLElement",aside:"HTMLElement",audio:"HTMLAudioElement",b:"HTMLElement",base:"HTMLBaseElement",basefont:"HTMLBaseFontElement",bdi:"HTMLElement",bdo:"HTMLElement",big:"HTMLElement",blockquote:"HTMLQuoteElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",center:"HTMLElement",cite:"HTMLElement",code:"HTMLElement",col:"HTMLTableColElement",colgroup:"HTMLTableColElement",command:"HTMLCommandElement",data:"HTMLElement",datalist:"HTMLDataListElement",dd:"HTMLElement",del:"HTMLModElement",details:"HTMLDetailsElement",dfn:"HTMLElement",dialog:"HTMLDialogElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",dt:"HTMLElement",em:"HTMLElement",fieldset:"HTMLFieldSetElement",figcaption:"HTMLElement",figure:"HTMLElement",font:"HTMLFontElement",footer:"HTMLElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",h2:"HTMLHeadingElement",h3:"HTMLHeadingElement",h4:"HTMLHeadingElement",h5:"HTMLHeadingElement",h6:"HTMLHeadingElement",head:"HTMLHeadElement",header:"HTMLElement",hgroup:"HTMLElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",i:"HTMLElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",ins:"HTMLModElement",isindex:"HTMLUnknownElement",kbd:"HTMLElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",mark:"HTMLElement",menu:"HTMLMenuElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",nav:"HTMLElement",nobr:"HTMLElement",noembed:"HTMLElement",noframes:"HTMLElement",noscript:"HTMLElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",s:"HTMLElement",samp:"HTMLElement",script:"HTMLScriptElement",section:"HTMLElement",select:"HTMLSelectElement",small:"HTMLElement",source:"HTMLSourceElement",span:"HTMLSpanElement",strike:"HTMLElement",strong:"HTMLElement",style:"HTMLStyleElement",sub:"HTMLElement",summary:"HTMLElement",sup:"HTMLElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",td:"HTMLTableDataCellElement",textarea:"HTMLTextAreaElement",tfoot:"HTMLTableSectionElement",th:"HTMLTableHeaderCellElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",tt:"HTMLElement",u:"HTMLElement",ul:"HTMLUListElement","var":"HTMLElement",video:"HTMLVideoElement",wbr:"HTMLElement"};html4["ELEMENT_DOM_INTERFACES"]=html4.ELEMENT_DOM_INTERFACES;html4.ueffects={NOT_LOADED:0,SAME_DOCUMENT:1,NEW_DOCUMENT:2};html4["ueffects"]=html4.ueffects;html4.URIEFFECTS={"a::href":2,"area::href":2,"audio::src":1,"blockquote::cite":0,"command::icon":1,"del::cite":0,"form::action":2,"img::src":1,"input::src":1,"ins::cite":0,"q::cite":0,"video::poster":1,"video::src":1};html4["URIEFFECTS"]=html4.URIEFFECTS;html4.ltypes={UNSANDBOXED:2,SANDBOXED:1,DATA:0};html4["ltypes"]=html4.ltypes;html4.LOADERTYPES={"a::href":2,"area::href":2,"audio::src":2,"blockquote::cite":2,"command::icon":1,"del::cite":2,"form::action":2,"img::src":1,"input::src":1,"ins::cite":2,"q::cite":2,"video::poster":1,"video::src":2};html4["LOADERTYPES"]=html4.LOADERTYPES;if(typeof window!=="undefined"){window["html4"]=html4}if("I".toLowerCase()!=="i"){throw"I/i problem"}var html=function(html4){var parseCssDeclarations,sanitizeCssProperty,cssSchema;if("undefined"!==typeof window){parseCssDeclarations=window["parseCssDeclarations"];sanitizeCssProperty=window["sanitizeCssProperty"];cssSchema=window["cssSchema"]}var ENTITIES={lt:"<",LT:"<",gt:">",GT:">",amp:"&",AMP:"&",quot:'"',apos:"'",nbsp:" "};var decimalEscapeRe=/^#(\d+)$/;var hexEscapeRe=/^#x([0-9A-Fa-f]+)$/;var safeEntityNameRe=/^[A-Za-z][A-za-z0-9]+$/;var entityLookupElement="undefined"!==typeof window&&window["document"]?window["document"].createElement("textarea"):null;function lookupEntity(name){if(ENTITIES.hasOwnProperty(name)){return ENTITIES[name]}var m=name.match(decimalEscapeRe);if(m){return String.fromCharCode(parseInt(m[1],10))}else if(!!(m=name.match(hexEscapeRe))){return String.fromCharCode(parseInt(m[1],16))}else if(entityLookupElement&&safeEntityNameRe.test(name)){entityLookupElement.innerHTML="&"+name+";";var text=entityLookupElement.textContent;ENTITIES[name]=text;return text}else{return"&"+name+";"}}function decodeOneEntity(_,name){return lookupEntity(name)}var nulRe=/\0/g;function stripNULs(s){return s.replace(nulRe,"")}var ENTITY_RE_1=/&(#[0-9]+|#[xX][0-9A-Fa-f]+|\w+);/g;var ENTITY_RE_2=/^(#[0-9]+|#[xX][0-9A-Fa-f]+|\w+);/;function unescapeEntities(s){return s.replace(ENTITY_RE_1,decodeOneEntity)}var ampRe=/&/g;var looseAmpRe=/&([^a-z#]|#(?:[^0-9x]|x(?:[^0-9a-f]|$)|$)|$)/gi;var ltRe=/[<]/g;var gtRe=/>/g;var quotRe=/\"/g;function escapeAttrib(s){return(""+s).replace(ampRe,"&").replace(ltRe,"<").replace(gtRe,">").replace(quotRe,""")}function normalizeRCData(rcdata){return rcdata.replace(looseAmpRe,"&$1").replace(ltRe,"<").replace(gtRe,">")}var ATTR_RE=new RegExp("^\\s*"+"([-.:\\w]+)"+"(?:"+("\\s*(=)\\s*"+"("+('(")[^"]*("|$)'+"|"+"(')[^']*('|$)"+"|"+"(?=[a-z][-\\w]*\\s*=)"+"|"+"[^\"'\\s]*")+")")+")?","i");var splitWillCapture="a,b".split(/(,)/).length===3;var EFLAGS_TEXT=html4.eflags["CDATA"]|html4.eflags["RCDATA"];function makeSaxParser(handler){var hcopy={cdata:handler.cdata||handler["cdata"],comment:handler.comment||handler["comment"],endDoc:handler.endDoc||handler["endDoc"],endTag:handler.endTag||handler["endTag"],pcdata:handler.pcdata||handler["pcdata"],rcdata:handler.rcdata||handler["rcdata"],startDoc:handler.startDoc||handler["startDoc"],startTag:handler.startTag||handler["startTag"]};return function(htmlText,param){return parse(htmlText,hcopy,param)}}var continuationMarker={};function parse(htmlText,handler,param){var m,p,tagName;var parts=htmlSplit(htmlText);var state={noMoreGT:false,noMoreEndComments:false};parseCPS(handler,parts,0,state,param)}function continuationMaker(h,parts,initial,state,param){return function(){parseCPS(h,parts,initial,state,param)}}function parseCPS(h,parts,initial,state,param){try{if(h.startDoc&&initial==0){h.startDoc(param)}var m,p,tagName;for(var pos=initial,end=parts.length;pos<end;){var current=parts[pos++];var next=parts[pos];switch(current){case"&":if(ENTITY_RE_2.test(next)){if(h.pcdata){h.pcdata("&"+next,param,continuationMarker,continuationMaker(h,parts,pos,state,param))}pos++}else{if(h.pcdata){h.pcdata("&",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}break;case"</":if(m=/^([-\w:]+)[^\'\"]*/.exec(next)){if(m[0].length===next.length&&parts[pos+1]===">"){pos+=2;tagName=m[1].toLowerCase();if(h.endTag){h.endTag(tagName,param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}else{pos=parseEndTag(parts,pos,h,param,continuationMarker,state)}}else{if(h.pcdata){h.pcdata("</",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}break;case"<":if(m=/^([-\w:]+)\s*\/?/.exec(next)){if(m[0].length===next.length&&parts[pos+1]===">"){pos+=2;tagName=m[1].toLowerCase();if(h.startTag){h.startTag(tagName,[],param,continuationMarker,continuationMaker(h,parts,pos,state,param))}var eflags=html4.ELEMENTS[tagName];if(eflags&EFLAGS_TEXT){var tag={name:tagName,next:pos,eflags:eflags};pos=parseText(parts,tag,h,param,continuationMarker,state)}}else{pos=parseStartTag(parts,pos,h,param,continuationMarker,state)}}else{if(h.pcdata){h.pcdata("<",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}break;case"<!--":if(!state.noMoreEndComments){for(p=pos+1;p<end;p++){if(parts[p]===">"&&/--$/.test(parts[p-1])){break}}if(p<end){if(h.comment){var comment=parts.slice(pos,p).join("");h.comment(comment.substr(0,comment.length-2),param,continuationMarker,continuationMaker(h,parts,p+1,state,param))}pos=p+1}else{state.noMoreEndComments=true}}if(state.noMoreEndComments){if(h.pcdata){h.pcdata("<!--",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}break;case"<!":if(!/^\w/.test(next)){if(h.pcdata){h.pcdata("<!",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}else{if(!state.noMoreGT){for(p=pos+1;p<end;p++){if(parts[p]===">"){break}}if(p<end){pos=p+1}else{state.noMoreGT=true}}if(state.noMoreGT){if(h.pcdata){h.pcdata("<!",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}}break;case"<?":if(!state.noMoreGT){for(p=pos+1;p<end;p++){if(parts[p]===">"){break}}if(p<end){pos=p+1}else{state.noMoreGT=true}}if(state.noMoreGT){if(h.pcdata){h.pcdata("<?",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}break;case">":if(h.pcdata){h.pcdata(">",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}break;case"":break;default:if(h.pcdata){h.pcdata(current,param,continuationMarker,continuationMaker(h,parts,pos,state,param))}break}}if(h.endDoc){h.endDoc(param)}}catch(e){if(e!==continuationMarker){throw e}}}function htmlSplit(str){var re=/(<\/|<\!--|<[!?]|[&<>])/g;str+="";if(splitWillCapture){return str.split(re)}else{var parts=[];var lastPos=0;var m;while((m=re.exec(str))!==null){parts.push(str.substring(lastPos,m.index));parts.push(m[0]);lastPos=m.index+m[0].length}parts.push(str.substring(lastPos));return parts}}function parseEndTag(parts,pos,h,param,continuationMarker,state){var tag=parseTagAndAttrs(parts,pos);if(!tag){return parts.length}if(h.endTag){h.endTag(tag.name,param,continuationMarker,continuationMaker(h,parts,pos,state,param))}return tag.next}function parseStartTag(parts,pos,h,param,continuationMarker,state){var tag=parseTagAndAttrs(parts,pos);if(!tag){return parts.length}if(h.startTag){h.startTag(tag.name,tag.attrs,param,continuationMarker,continuationMaker(h,parts,tag.next,state,param))}if(tag.eflags&EFLAGS_TEXT){return parseText(parts,tag,h,param,continuationMarker,state)}else{return tag.next}}var endTagRe={};function parseText(parts,tag,h,param,continuationMarker,state){var end=parts.length;if(!endTagRe.hasOwnProperty(tag.name)){endTagRe[tag.name]=new RegExp("^"+tag.name+"(?:[\\s\\/]|$)","i")}var re=endTagRe[tag.name];var first=tag.next;var p=tag.next+1;for(;p<end;p++){if(parts[p-1]==="</"&&re.test(parts[p])){break}}if(p<end){p-=1}var buf=parts.slice(first,p).join("");if(tag.eflags&html4.eflags["CDATA"]){if(h.cdata){h.cdata(buf,param,continuationMarker,continuationMaker(h,parts,p,state,param))}}else if(tag.eflags&html4.eflags["RCDATA"]){if(h.rcdata){h.rcdata(normalizeRCData(buf),param,continuationMarker,continuationMaker(h,parts,p,state,param))}}else{throw new Error("bug")}return p}function parseTagAndAttrs(parts,pos){var m=/^([-\w:]+)/.exec(parts[pos]);var tag={};tag.name=m[1].toLowerCase();tag.eflags=html4.ELEMENTS[tag.name];var buf=parts[pos].substr(m[0].length);var p=pos+1;var end=parts.length;for(;p<end;p++){if(parts[p]===">"){break}buf+=parts[p]}if(end<=p){return void 0}var attrs=[];while(buf!==""){m=ATTR_RE.exec(buf);if(!m){buf=buf.replace(/^[\s\S][^a-z\s]*/,"")}else if(m[4]&&!m[5]||m[6]&&!m[7]){var quote=m[4]||m[6];var sawQuote=false;var abuf=[buf,parts[p++]];for(;p<end;p++){if(sawQuote){if(parts[p]===">"){break}}else if(0<=parts[p].indexOf(quote)){sawQuote=true}abuf.push(parts[p])}if(end<=p){break}buf=abuf.join("");continue}else{var aName=m[1].toLowerCase();var aValue=m[2]?decodeValue(m[3]):"";attrs.push(aName,aValue);buf=buf.substr(m[0].length)}}tag.attrs=attrs;tag.next=p+1;return tag}function decodeValue(v){var q=v.charCodeAt(0);if(q===34||q===39){v=v.substr(1,v.length-2)}return unescapeEntities(stripNULs(v))}function makeHtmlSanitizer(tagPolicy){var stack;var ignoring;var emit=function(text,out){if(!ignoring){out.push(text)}};return makeSaxParser({startDoc:function(_){stack=[];ignoring=false},startTag:function(tagNameOrig,attribs,out){if(ignoring){return}if(!html4.ELEMENTS.hasOwnProperty(tagNameOrig)){return}var eflagsOrig=html4.ELEMENTS[tagNameOrig];if(eflagsOrig&html4.eflags["FOLDABLE"]){return}var decision=tagPolicy(tagNameOrig,attribs);if(!decision){ignoring=!(eflagsOrig&html4.eflags["EMPTY"]);</span> <span class='diff-add'>return}else if(typeof decision!=="object"){throw new Error("tagPolicy did not return object (old API?)")}if("attribs"in decision){attribs=decision["attribs"]}else{throw new Error("tagPolicy gave no attribs")}var eflagsRep;var tagNameRep;if("tagName"in decision){tagNameRep=decision["tagName"];eflagsRep=html4.ELEMENTS[tagNameRep]}else{tagNameRep=tagNameOrig;eflagsRep=eflagsOrig}if(eflagsOrig&html4.eflags["OPTIONAL_ENDTAG"]){var onStack=stack[stack.length-1];if(onStack&&onStack.orig===tagNameOrig&&(onStack.rep!==tagNameRep||tagNameOrig!==tagNameRep)){out.push("</",onStack.rep,">")}}if(!(eflagsOrig&html4.eflags["EMPTY"])){stack.push({orig:tagNameOrig,rep:tagNameRep})}out.push("<",tagNameRep);for(var i=0,n=attribs.length;i<n;i+=2){var attribName=attribs[i],value=attribs[i+1];if(value!==null&&value!==void 0){out.push(" ",attribName,'="',escapeAttrib(value),'"')}}out.push(">");if(eflagsOrig&html4.eflags["EMPTY"]&&!(eflagsRep&html4.eflags["EMPTY"])){out.push("</",tagNameRep,">")}},endTag:function(tagName,out){if(ignoring){ignoring=false;return}if(!html4.ELEMENTS.hasOwnProperty(tagName)){return}var eflags=html4.ELEMENTS[tagName];if(!(eflags&(html4.eflags["EMPTY"]|html4.eflags["FOLDABLE"]))){var index;if(eflags&html4.eflags["OPTIONAL_ENDTAG"]){for(index=stack.length;--index>=0;){var stackElOrigTag=stack[index].orig;if(stackElOrigTag===tagName){break}if(!(html4.ELEMENTS[stackElOrigTag]&html4.eflags["OPTIONAL_ENDTAG"])){return}}}else{for(index=stack.length;--index>=0;){if(stack[index].orig===tagName){break}}}if(index<0){return}for(var i=stack.length;--i>index;){var stackElRepTag=stack[i].rep;if(!(html4.ELEMENTS[stackElRepTag]&html4.eflags["OPTIONAL_ENDTAG"])){out.push("</",stackElRepTag,">")}}if(index<stack.length){tagName=stack[index].rep}stack.length=index;out.push("</",tagName,">")}},pcdata:emit,rcdata:emit,cdata:emit,endDoc:function(out){for(;stack.length;stack.length--){out.push("</",stack[stack.length-1].rep,">")}}})}var ALLOWED_URI_SCHEMES=/^(?:https?|mailto)$/i;function safeUri(uri,effect,ltype,hints,naiveUriRewriter){if(!naiveUriRewriter){return null}try{var parsed=URI.parse(""+uri);if(parsed){if(!parsed.hasScheme()||ALLOWED_URI_SCHEMES.test(parsed.getScheme())){var safe=naiveUriRewriter(parsed,effect,ltype,hints);return safe?safe.toString():null}}}catch(e){return null}return null}function log(logger,tagName,attribName,oldValue,newValue){if(!attribName){logger(tagName+" removed",{change:"removed",tagName:tagName})}if(oldValue!==newValue){var changed="changed";if(oldValue&&!newValue){changed="removed"}else if(!oldValue&&newValue){changed="added"}logger(tagName+"."+attribName+" "+changed,{change:changed,tagName:tagName,attribName:attribName,oldValue:oldValue,newValue:newValue})}}function lookupAttribute(map,tagName,attribName){var attribKey;attribKey=tagName+"::"+attribName;if(map.hasOwnProperty(attribKey)){return map[attribKey]}attribKey="*::"+attribName;if(map.hasOwnProperty(attribKey)){return map[attribKey]}return void 0}function getAttributeType(tagName,attribName){return lookupAttribute(html4.ATTRIBS,tagName,attribName)}function getLoaderType(tagName,attribName){return lookupAttribute(html4.LOADERTYPES,tagName,attribName)}function getUriEffect(tagName,attribName){return lookupAttribute(html4.URIEFFECTS,tagName,attribName)}function sanitizeAttribs(tagName,attribs,opt_naiveUriRewriter,opt_nmTokenPolicy,opt_logger){for(var i=0;i<attribs.length;i+=2){var attribName=attribs[i];var value=attribs[i+1];var oldValue=value;var atype=null,attribKey;if((attribKey=tagName+"::"+attribName,html4.ATTRIBS.hasOwnProperty(attribKey))||(attribKey="*::"+attribName,html4.ATTRIBS.hasOwnProperty(attribKey))){atype=html4.ATTRIBS[attribKey]}if(atype!==null){switch(atype){case html4.atype["NONE"]:break;case html4.atype["SCRIPT"]:value=null;if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}break;case html4.atype["STYLE"]:if("undefined"===typeof parseCssDeclarations){value=null;if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}break}var sanitizedDeclarations=[];parseCssDeclarations(value,{declaration:function(property,tokens){var normProp=property.toLowerCase();sanitizeCssProperty(normProp,tokens,opt_naiveUriRewriter?function(url){return safeUri(url,html4.ueffects.SAME_DOCUMENT,html4.ltypes.SANDBOXED,{TYPE:"CSS",CSS_PROP:normProp},opt_naiveUriRewriter)}:null);if(tokens.length){sanitizedDeclarations.push(normProp+": "+tokens.join(" "))}}});value=sanitizedDeclarations.length>0?sanitizedDeclarations.join(" ; "):null;if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}break;case html4.atype["ID"]:case html4.atype["IDREF"]:case html4.atype["IDREFS"]:case html4.atype["GLOBAL_NAME"]:case html4.atype["LOCAL_NAME"]:case html4.atype["CLASSES"]:value=opt_nmTokenPolicy?opt_nmTokenPolicy(value):value;if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}break;case html4.atype["URI"]:value=safeUri(value,getUriEffect(tagName,attribName),getLoaderType(tagName,attribName),{TYPE:"MARKUP",XML_ATTR:attribName,XML_TAG:tagName},opt_naiveUriRewriter);if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}break;case html4.atype["URI_FRAGMENT"]:if(value&&"#"===value.charAt(0)){value=value.substring(1);value=opt_nmTokenPolicy?opt_nmTokenPolicy(value):value;if(value!==null&&value!==void 0){value="#"+value}}else{value=null}if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}break;default:value=null;if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}break}}else{value=null;if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}}attribs[i+1]=value}return attribs}function makeTagPolicy(opt_naiveUriRewriter,opt_nmTokenPolicy,opt_logger){return function(tagName,attribs){if(!(html4.ELEMENTS[tagName]&html4.eflags["UNSAFE"])){return{attribs:sanitizeAttribs(tagName,attribs,opt_naiveUriRewriter,opt_nmTokenPolicy,opt_logger)}}else{if(opt_logger){log(opt_logger,tagName,undefined,undefined,undefined)}}}}function sanitizeWithPolicy(inputHtml,tagPolicy){var outputArray=[];makeHtmlSanitizer(tagPolicy)(inputHtml,outputArray);return outputArray.join("")}function sanitize(inputHtml,opt_naiveUriRewriter,opt_nmTokenPolicy,opt_logger){var tagPolicy=makeTagPolicy(opt_naiveUriRewriter,opt_nmTokenPolicy,opt_logger);return sanitizeWithPolicy(inputHtml,tagPolicy)}var html={};html.escapeAttrib=html["escapeAttrib"]=escapeAttrib;html.makeHtmlSanitizer=html["makeHtmlSanitizer"]=makeHtmlSanitizer;html.makeSaxParser=html["makeSaxParser"]=makeSaxParser;html.makeTagPolicy=html["makeTagPolicy"]=makeTagPolicy;html.normalizeRCData=html["normalizeRCData"]=normalizeRCData;html.sanitize=html["sanitize"]=sanitize;html.sanitizeAttribs=html["sanitizeAttribs"]=sanitizeAttribs;html.sanitizeWithPolicy=html["sanitizeWithPolicy"]=sanitizeWithPolicy;html.unescapeEntities=html["unescapeEntities"]=unescapeEntities;return html}(html4);var html_sanitize=html["sanitize"];if(typeof window!=="undefined"){window["html"]=html;window["html_sanitize"]=html_sanitize}</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/init.js b/ipynb/Array-feature-overlap-05_files/init.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..9dde6b0</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/init.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> "widgets/js/manager",</span> <span class='diff-add'> "widgets/js/widget_link",</span> <span class='diff-add'> "widgets/js/widget_bool",</span> <span class='diff-add'> "widgets/js/widget_button",</span> <span class='diff-add'> "widgets/js/widget_box",</span> <span class='diff-add'> "widgets/js/widget_float",</span> <span class='diff-add'> "widgets/js/widget_image",</span> <span class='diff-add'> "widgets/js/widget_int",</span> <span class='diff-add'> "widgets/js/widget_output",</span> <span class='diff-add'> "widgets/js/widget_selection",</span> <span class='diff-add'> "widgets/js/widget_selectioncontainer",</span> <span class='diff-add'> "widgets/js/widget_string",</span> <span class='diff-add'>], function(widgetmanager, linkModels) {</span> <span class='diff-add'> for (var target_name in linkModels) {</span> <span class='diff-add'> if (linkModels.hasOwnProperty(target_name)) {</span> <span class='diff-add'> widgetmanager.WidgetManager.register_widget_model(target_name, linkModels[target_name]);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Register all of the loaded views with the widget manager.</span> <span class='diff-add'> for (var i = 2; i < arguments.length; i++) {</span> <span class='diff-add'> for (var target_name in arguments[i]) {</span> <span class='diff-add'> if (arguments[i].hasOwnProperty(target_name)) {</span> <span class='diff-add'> widgetmanager.WidgetManager.register_widget_view(target_name, arguments[i][target_name]);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return {'WidgetManager': widgetmanager.WidgetManager}; </span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/jquery-ui.min.css b/ipynb/Array-feature-overlap-05_files/jquery-ui.min.css</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..b8b6f0a</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/jquery-ui.min.css</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>/*! jQuery UI - v1.10.3 - 2013-05-03</span> <span class='diff-add'>* http://jqueryui.com</span> <span class='diff-add'>* Includes: jquery.ui.core.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css</span> <span class='diff-add'>* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px</span> <span class='diff-add'>* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:21px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:0}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:400}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:400;margin:-1px}.ui-menu .ui-state-disabled{font-weight:400;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url(images/animated-overlay.gif);height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:0;background:0;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:0;border-bottom:0;border-right:0}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_888888_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/jquery-ui.min.js b/ipynb/Array-feature-overlap-05_files/jquery-ui.min.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..82bbb67</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/jquery-ui.min.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>/*! jQuery UI - v1.10.3 - 2013-05-03</span> <span class='diff-add'>* http://jqueryui.com</span> <span class='diff-add'>* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.effect.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js, jquery.ui.menu.js, jquery.ui.position.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js</span> <span class='diff-add'>* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */</span> <span class='diff-add'>(function(t,e){function i(e,i){var n,o,a,r=e.nodeName.toLowerCase();return"area"===r?(n=e.parentNode,o=n.name,e.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap=#"+o+"]")[0],!!a&&s(a)):!1):(/input|select|textarea|button|object/.test(r)?!e.disabled:"a"===r?e.href||i:i)&&s(e)}function s(e){return t.expr.filters.visible(e)&&!t(e).parents().addBack().filter(function(){return"hidden"===t.css(this,"visibility")}).length}var n=0,o=/^ui-id-\d+$/;t.ui=t.ui||{},t.extend(t.ui,{version:"1.10.3",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),t.fn.extend({focus:function(e){return function(i,s){return"number"==typeof i?this.each(function(){var e=this;setTimeout(function(){t(e).focus(),s&&s.call(e)},i)}):e.apply(this,arguments)}}(t.fn.focus),scrollParent:function(){var e;return e=t.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(t.css(this,"position"))&&/(auto|scroll)/.test(t.css(this,"overflow")+t.css(this,"overflow-y")+t.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(t.css(this,"overflow")+t.css(this,"overflow-y")+t.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!e.length?t(document):e},zIndex:function(i){if(i!==e)return this.css("zIndex",i);if(this.length)for(var s,n,o=t(this[0]);o.length&&o[0]!==document;){if(s=o.css("position"),("absolute"===s||"relative"===s||"fixed"===s)&&(n=parseInt(o.css("zIndex"),10),!isNaN(n)&&0!==n))return n;o=o.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++n)})},removeUniqueId:function(){return this.each(function(){o.test(this.id)&&t(this).removeAttr("id")})}}),t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])},focusable:function(e){return i(e,!isNaN(t.attr(e,"tabindex")))},tabbable:function(e){var s=t.attr(e,"tabindex"),n=isNaN(s);return(n||s>=0)&&i(e,!n)}}),t("<a>").outerWidth(1).jquery||t.each(["Width","Height"],function(i,s){function n(e,i,s,n){return t.each(o,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),n&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var o="Width"===s?["Left","Right"]:["Top","Bottom"],a=s.toLowerCase(),r={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+s]=function(i){return i===e?r["inner"+s].call(this):this.each(function(){t(this).css(a,n(this,i)+"px")})},t.fn["outer"+s]=function(e,i){return"number"!=typeof e?r["outer"+s].call(this,e):this.each(function(){t(this).css(a,n(this,e,!0,i)+"px")})}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(t.fn.removeData=function(e){return function(i){return arguments.length?e.call(this,t.camelCase(i)):e.call(this)}}(t.fn.removeData)),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),t.support.selectstart="onselectstart"in document.createElement("div"),t.fn.extend({disableSelection:function(){return this.bind((t.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(t){t.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),t.extend(t.ui,{plugin:{add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i){var s,n=t.plugins[e];if(n&&t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType)for(s=0;n.length>s;s++)t.options[n[s][0]]&&n[s][1].apply(t.element,i)}},hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)}})})(jQuery),function(t,e){var i=0,s=Array.prototype.slice,n=t.cleanData;t.cleanData=function(e){for(var i,s=0;null!=(i=e[s]);s++)try{t(i).triggerHandler("remove")}catch(o){}n(e)},t.widget=function(i,s,n){var o,a,r,h,l={},c=i.split(".")[0];i=i.split(".")[1],o=c+"-"+i,n||(n=s,s=t.Widget),t.expr[":"][o.toLowerCase()]=function(e){return!!t.data(e,o)},t[c]=t[c]||{},a=t[c][i],r=t[c][i]=function(t,i){return this._createWidget?(arguments.length&&this._createWidget(t,i),e):new r(t,i)},t.extend(r,a,{version:n.version,_proto:t.extend({},n),_childConstructors:[]}),h=new s,h.options=t.widget.extend({},h.options),t.each(n,function(i,n){return t.isFunction(n)?(l[i]=function(){var t=function(){return s.prototype[i].apply(this,arguments)},e=function(t){return s.prototype[i].apply(this,t)};return function(){var i,s=this._super,o=this._superApply;return this._super=t,this._superApply=e,i=n.apply(this,arguments),this._super=s,this._superApply=o,i}}(),e):(l[i]=n,e)}),r.prototype=t.widget.extend(h,{widgetEventPrefix:a?h.widgetEventPrefix:i},l,{constructor:r,namespace:c,widgetName:i,widgetFullName:o}),a?(t.each(a._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,r,i._proto)}),delete a._childConstructors):s._childConstructors.push(r),t.widget.bridge(i,r)},t.widget.extend=function(i){for(var n,o,a=s.call(arguments,1),r=0,h=a.length;h>r;r++)for(n in a[r])o=a[r][n],a[r].hasOwnProperty(n)&&o!==e&&(i[n]=t.isPlainObject(o)?t.isPlainObject(i[n])?t.widget.extend({},i[n],o):t.widget.extend({},o):o);return i},t.widget.bridge=function(i,n){var o=n.prototype.widgetFullName||i;t.fn[i]=function(a){var r="string"==typeof a,h=s.call(arguments,1),l=this;return a=!r&&h.length?t.widget.extend.apply(null,[a].concat(h)):a,r?this.each(function(){var s,n=t.data(this,o);return n?t.isFunction(n[a])&&"_"!==a.charAt(0)?(s=n[a].apply(n,h),s!==n&&s!==e?(l=s&&s.jquery?l.pushStack(s.get()):s,!1):e):t.error("no such method '"+a+"' for "+i+" widget instance"):t.error("cannot call methods on "+i+" prior to initialization; "+"attempted to call method '"+a+"'")}):this.each(function(){var e=t.data(this,o);e?e.option(a||{})._init():t.data(this,o,new n(a,this))}),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this.bindings=t(),this.hoverable=t(),this.focusable=t(),s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:t.noop,_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(t.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:t.noop,widget:function(){return this.element},option:function(i,s){var n,o,a,r=i;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof i)if(r={},n=i.split("."),i=n.shift(),n.length){for(o=r[i]=t.widget.extend({},this.options[i]),a=0;n.length-1>a;a++)o[n[a]]=o[n[a]]||{},o=o[n[a]];if(i=n.pop(),s===e)return o[i]===e?null:o[i];o[i]=s}else{if(s===e)return this.options[i]===e?null:this.options[i];r[i]=s}return this._setOptions(r),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return this.options[t]=e,"disabled"===t&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!e).attr("aria-disabled",e),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,n){var o,a=this;"boolean"!=typeof i&&(n=s,s=i,i=!1),n?(s=o=t(s),this.bindings=this.bindings.add(s)):(n=s,s=this.element,o=this.widget()),t.each(n,function(n,r){function h(){return i||a.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof r?a[r]:r).apply(a,arguments):e}"string"!=typeof r&&(h.guid=r.guid=r.guid||h.guid||t.guid++);var l=n.match(/^(\w+)\s*(.*)$/),c=l[1]+a.eventNamespace,u=l[2];u?o.delegate(u,c,h):s.bind(c,h)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(e).undelegate(e)},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){t(e.currentTarget).addClass("ui-state-hover")},mouseleave:function(e){t(e.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){t(e.currentTarget).addClass("ui-state-focus")},focusout:function(e){t(e.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}})}(jQuery),function(t){var e=!1;t(document).mouseup(function(){e=!1}),t.widget("ui.mouse",{version:"1.10.3",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.bind("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).bind("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):undefined}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&t(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(i){if(!e){this._mouseStarted&&this._mouseUp(i),this._mouseDownEvent=i;var s=this,n=1===i.which,o="string"==typeof this.options.cancel&&i.target.nodeName?t(i.target).closest(this.options.cancel).length:!1;return n&&!o&&this._mouseCapture(i)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){s.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(i)&&this._mouseDelayMet(i)&&(this._mouseStarted=this._mouseStart(i)!==!1,!this._mouseStarted)?(i.preventDefault(),!0):(!0===t.data(i.target,this.widgetName+".preventClickEvent")&&t.removeData(i.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return s._mouseMove(t)},this._mouseUpDelegate=function(t){return s._mouseUp(t)},t(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),i.preventDefault(),e=!0,!0)):!0}},_mouseMove:function(e){return t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button?this._mouseUp(e):this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){return t(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),!1},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}})}(jQuery),function(t){t.widget("ui.draggable",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"!==this.options.helper||/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},_destroy:function(){this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy()},_mouseCapture:function(e){var i=this.options;return this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(t(i.iframeFix===!0?"iframe":i.iframeFix).each(function(){t("<div class='ui-draggable-iframeFix' style='background: #fff;'></div>").css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(t(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offsetParent=this.helper.offsetParent(),this.offsetParentCssPosition=this.offsetParent.css("position"),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.offset.scroll=!1,t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_mouseDrag:function(e,i){if("fixed"===this.offsetParentCssPosition&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"original"!==this.options.helper||t.contains(this.element[0].ownerDocument,this.element[0])?("invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1):!1},_mouseUp:function(e){return t("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return s.parents("body").length||s.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s[0]===this.element[0]||/(fixed|absolute)/.test(s.css("position"))||s.css("position","absolute"),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.element.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;return n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],undefined):"document"===n.containment?(this.containment=[0,0,t(document).width()-this.helperProportions.width-this.margins.left,(t(document).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],undefined):n.containment.constructor===Array?(this.containment=n.containment,undefined):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e="hidden"!==i.css("overflow"),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=i),undefined):(this.containment=null,undefined)},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent;return this.offset.scroll||(this.offset.scroll={top:n.scrollTop(),left:n.scrollLeft()}),{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():this.offset.scroll.top)*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():this.offset.scroll.left)*s}},_generatePosition:function(e){var i,s,n,o,a=this.options,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=e.pageX,l=e.pageY;return this.offset.scroll||(this.offset.scroll={top:r.scrollTop(),left:r.scrollLeft()}),this.originalPosition&&(this.containment&&(this.relative_container?(s=this.relative_container.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-a.grid[1]:n+a.grid[1]:n,o=a.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,h=i?o-this.offset.click.left>=i[0]||o-this.offset.click.left>i[2]?o:o-this.offset.click.left>=i[0]?o-a.grid[0]:o+a.grid[0]:o)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s]),"drag"===e&&(this.positionAbs=this._convertPositionTo("absolute")),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i){var s=t(this).data("ui-draggable"),n=s.options,o=t.extend({},i,{item:s.element});s.sortables=[],t(n.connectToSortable).each(function(){var i=t.data(this,"ui-sortable");i&&!i.options.disabled&&(s.sortables.push({instance:i,shouldRevert:i.options.revert}),i.refreshPositions(),i._trigger("activate",e,o))})},stop:function(e,i){var s=t(this).data("ui-draggable"),n=t.extend({},i,{item:s.element});t.each(s.sortables,function(){this.instance.isOver?(this.instance.isOver=0,s.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=this.shouldRevert),this.instance._mouseStop(e),this.instance.options.helper=this.instance.options._helper,"original"===s.options.helper&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",e,n))})},drag:function(e,i){var s=t(this).data("ui-draggable"),n=this;t.each(s.sortables,function(){var o=!1,a=this;this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this.instance._intersectsWith(this.instance.containerCache)&&(o=!0,t.each(s.sortables,function(){return this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this!==a&&this.instance._intersectsWith(this.instance.containerCache)&&t.contains(a.instance.element[0],this.instance.element[0])&&(o=!1),o})),o?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=t(n).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return i.helper[0]},e.target=this.instance.currentItem[0],this.instance._mouseCapture(e,!0),this.instance._mouseStart(e,!0,!0),this.instance.offset.click.top=s.offset.click.top,this.instance.offset.click.left=s.offset.click.left,this.instance.offset.parent.left-=s.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=s.offset.parent.top-this.instance.offset.parent.top,s._trigger("toSortable",e),s.dropped=this.instance.element,s.currentItem=s.element,this.instance.fromOutside=s),this.instance.currentItem&&this.instance._mouseDrag(e)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",e,this.instance._uiHash(this.instance)),this.instance._mouseStop(e,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),s._trigger("fromSortable",e),s.dropped=!1)})}}),t.ui.plugin.add("draggable","cursor",{start:function(){var e=t("body"),i=t(this).data("ui-draggable").options;e.css("cursor")&&(i._cursor=e.css("cursor")),e.css("cursor",i.cursor)},stop:function(){var e=t(this).data("ui-draggable").options;e._cursor&&t("body").css("cursor",e._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i){var s=t(i.helper),n=t(this).data("ui-draggable").options;s.css("opacity")&&(n._opacity=s.css("opacity")),s.css("opacity",n.opacity)},stop:function(e,i){var s=t(this).data("ui-draggable").options;s._opacity&&t(i.helper).css("opacity",s._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(){var e=t(this).data("ui-draggable");e.scrollParent[0]!==document&&"HTML"!==e.scrollParent[0].tagName&&(e.overflowOffset=e.scrollParent.offset())},drag:function(e){var i=t(this).data("ui-draggable"),s=i.options,n=!1;i.scrollParent[0]!==document&&"HTML"!==i.scrollParent[0].tagName?(s.axis&&"x"===s.axis||(i.overflowOffset.top+i.scrollParent[0].offsetHeight-e.pageY<s.scrollSensitivity?i.scrollParent[0].scrollTop=n=i.scrollParent[0].scrollTop+s.scrollSpeed:e.pageY-i.overflowOffset.top<s.scrollSensitivity&&(i.scrollParent[0].scrollTop=n=i.scrollParent[0].scrollTop-s.scrollSpeed)),s.axis&&"y"===s.axis||(i.overflowOffset.left+i.scrollParent[0].offsetWidth-e.pageX<s.scrollSensitivity?i.scrollParent[0].scrollLeft=n=i.scrollParent[0].scrollLeft+s.scrollSpeed:e.pageX-i.overflowOffset.left<s.scrollSensitivity&&(i.scrollParent[0].scrollLeft=n=i.scrollParent[0].scrollLeft-s.scrollSpeed))):(s.axis&&"x"===s.axis||(e.pageY-t(document).scrollTop()<s.scrollSensitivity?n=t(document).scrollTop(t(document).scrollTop()-s.scrollSpeed):t(window).height()-(e.pageY-t(document).scrollTop())<s.scrollSensitivity&&(n=t(document).scrollTop(t(document).scrollTop()+s.scrollSpeed))),s.axis&&"y"===s.axis||(e.pageX-t(document).scrollLeft()<s.scrollSensitivity?n=t(document).scrollLeft(t(document).scrollLeft()-s.scrollSpeed):t(window).width()-(e.pageX-t(document).scrollLeft())<s.scrollSensitivity&&(n=t(document).scrollLeft(t(document).scrollLeft()+s.scrollSpeed)))),n!==!1&&t.ui.ddmanager&&!s.dropBehaviour&&t.ui.ddmanager.prepareOffsets(i,e)}}),t.ui.plugin.add("draggable","snap",{start:function(){var e=t(this).data("ui-draggable"),i=e.options;e.snapElements=[],t(i.snap.constructor!==String?i.snap.items||":data(ui-draggable)":i.snap).each(function(){var i=t(this),s=i.offset();this!==e.element[0]&&e.snapElements.push({item:this,width:i.outerWidth(),height:i.outerHeight(),top:s.top,left:s.left})})},drag:function(e,i){var s,n,o,a,r,h,l,c,u,d,p=t(this).data("ui-draggable"),f=p.options,g=f.snapTolerance,m=i.offset.left,v=m+p.helperProportions.width,_=i.offset.top,b=_+p.helperProportions.height;for(u=p.snapElements.length-1;u>=0;u--)r=p.snapElements[u].left,h=r+p.snapElements[u].width,l=p.snapElements[u].top,c=l+p.snapElements[u].height,r-g>v||m>h+g||l-g>b||_>c+g||!t.contains(p.snapElements[u].item.ownerDocument,p.snapElements[u].item)?(p.snapElements[u].snapping&&p.options.snap.release&&p.options.snap.release.call(p.element,e,t.extend(p._uiHash(),{snapItem:p.snapElements[u].item})),p.snapElements[u].snapping=!1):("inner"!==f.snapMode&&(s=g>=Math.abs(l-b),n=g>=Math.abs(c-_),o=g>=Math.abs(r-v),a=g>=Math.abs(h-m),s&&(i.position.top=p._convertPositionTo("relative",{top:l-p.helperProportions.height,left:0}).top-p.margins.top),n&&(i.position.top=p._convertPositionTo("relative",{top:c,left:0}).top-p.margins.top),o&&(i.position.left=p._convertPositionTo("relative",{top:0,left:r-p.helperProportions.width}).left-p.margins.left),a&&(i.position.left=p._convertPositionTo("relative",{top:0,left:h}).left-p.margins.left)),d=s||n||o||a,"outer"!==f.snapMode&&(s=g>=Math.abs(l-_),n=g>=Math.abs(c-b),o=g>=Math.abs(r-m),a=g>=Math.abs(h-v),s&&(i.position.top=p._convertPositionTo("relative",{top:l,left:0}).top-p.margins.top),n&&(i.position.top=p._convertPositionTo("relative",{top:c-p.helperProportions.height,left:0}).top-p.margins.top),o&&(i.position.left=p._convertPositionTo("relative",{top:0,left:r}).left-p.margins.left),a&&(i.position.left=p._convertPositionTo("relative",{top:0,left:h-p.helperProportions.width}).left-p.margins.left)),!p.snapElements[u].snapping&&(s||n||o||a||d)&&p.options.snap.snap&&p.options.snap.snap.call(p.element,e,t.extend(p._uiHash(),{snapItem:p.snapElements[u].item})),p.snapElements[u].snapping=s||n||o||a||d)}}),t.ui.plugin.add("draggable","stack",{start:function(){var e,i=this.data("ui-draggable").options,s=t.makeArray(t(i.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});s.length&&(e=parseInt(t(s[0]).css("zIndex"),10)||0,t(s).each(function(i){t(this).css("zIndex",e+i)}),this.css("zIndex",e+s.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i){var s=t(i.helper),n=t(this).data("ui-draggable").options;s.css("zIndex")&&(n._zIndex=s.css("zIndex")),s.css("zIndex",n.zIndex)},stop:function(e,i){var s=t(this).data("ui-draggable").options;s._zIndex&&t(i.helper).css("zIndex",s._zIndex)}})}(jQuery),function(t){function e(t,e,i){return t>e&&e+i>t}t.widget("ui.droppable",{version:"1.10.3",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e=this.options,i=e.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(i)?i:function(t){return t.is(i)</span> <span class='diff-add'>},this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight},t.ui.ddmanager.droppables[e.scope]=t.ui.ddmanager.droppables[e.scope]||[],t.ui.ddmanager.droppables[e.scope].push(this),e.addClasses&&this.element.addClass("ui-droppable")},_destroy:function(){for(var e=0,i=t.ui.ddmanager.droppables[this.options.scope];i.length>e;e++)i[e]===this&&i.splice(e,1);this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(e,i){"accept"===e&&(this.accept=t.isFunction(i)?i:function(t){return t.is(i)}),t.Widget.prototype._setOption.apply(this,arguments)},_activate:function(e){var i=t.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",e,this.ui(i)))},_drop:function(e,i){var s=i||t.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var e=t.data(this,"ui-droppable");return e.options.greedy&&!e.options.disabled&&e.options.scope===s.options.scope&&e.accept.call(e.element[0],s.currentItem||s.element)&&t.ui.intersect(s,t.extend(e,{offset:e.element.offset()}),e.options.tolerance)?(n=!0,!1):undefined}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",e,this.ui(s)),this.element):!1):!1},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}}}),t.ui.intersect=function(t,i,s){if(!i.offset)return!1;var n,o,a=(t.positionAbs||t.position.absolute).left,r=a+t.helperProportions.width,h=(t.positionAbs||t.position.absolute).top,l=h+t.helperProportions.height,c=i.offset.left,u=c+i.proportions.width,d=i.offset.top,p=d+i.proportions.height;switch(s){case"fit":return a>=c&&u>=r&&h>=d&&p>=l;case"intersect":return a+t.helperProportions.width/2>c&&u>r-t.helperProportions.width/2&&h+t.helperProportions.height/2>d&&p>l-t.helperProportions.height/2;case"pointer":return n=(t.positionAbs||t.position.absolute).left+(t.clickOffset||t.offset.click).left,o=(t.positionAbs||t.position.absolute).top+(t.clickOffset||t.offset.click).top,e(o,d,i.proportions.height)&&e(n,c,i.proportions.width);case"touch":return(h>=d&&p>=h||l>=d&&p>=l||d>h&&l>p)&&(a>=c&&u>=a||r>=c&&u>=r||c>a&&r>u);default:return!1}},t.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,i){var s,n,o=t.ui.ddmanager.droppables[e.options.scope]||[],a=i?i.type:null,r=(e.currentItem||e.element).find(":data(ui-droppable)").addBack();t:for(s=0;o.length>s;s++)if(!(o[s].options.disabled||e&&!o[s].accept.call(o[s].element[0],e.currentItem||e.element))){for(n=0;r.length>n;n++)if(r[n]===o[s].element[0]){o[s].proportions.height=0;continue t}o[s].visible="none"!==o[s].element.css("display"),o[s].visible&&("mousedown"===a&&o[s]._activate.call(o[s],i),o[s].offset=o[s].element.offset(),o[s].proportions={width:o[s].element[0].offsetWidth,height:o[s].element[0].offsetHeight})}},drop:function(e,i){var s=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&t.ui.intersect(e,this,this.options.tolerance)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(e,i){e.element.parentsUntil("body").bind("scroll.droppable",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,o,a=t.ui.intersect(e,this,this.options.tolerance),r=!a&&this.isover?"isout":a&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,o=this.element.parents(":data(ui-droppable)").filter(function(){return t.data(this,"ui-droppable").options.scope===n}),o.length&&(s=t.data(o[0],"ui-droppable"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(e,i){e.element.parentsUntil("body").unbind("scroll.droppable"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}}}(jQuery),function(t){function e(t){return parseInt(t,10)||0}function i(t){return!isNaN(parseInt(t,10))}t.widget("ui.resizable",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_create:function(){var e,i,s,n,o,a=this,r=this.options;if(this.element.addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.data("ui-resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),e=this.handles.split(","),this.handles={},i=0;e.length>i;i++)s=t.trim(e[i]),o="ui-resizable-"+s,n=t("<div class='ui-resizable-handle "+o+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String&&(this.handles[i]=t(this.handles[i],this.element).show()),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),t(this.handles[i]).length},this._renderAxis(this.element),this._handles=t(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){a.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),a.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),t(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(t(this).removeClass("ui-resizable-autohide"),a._handles.show())}).mouseleave(function(){r.disabled||a.resizing||(t(this).addClass("ui-resizable-autohide"),a._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(i){var s,n,o,a=this.options,r=this.element.position(),h=this.element;return this.resizing=!0,/absolute/.test(h.css("position"))?h.css({position:"absolute",top:h.css("top"),left:h.css("left")}):h.is(".ui-draggable")&&h.css({position:"absolute",top:r.top,left:r.left}),this._renderProxy(),s=e(this.helper.css("left")),n=e(this.helper.css("top")),a.containment&&(s+=t(a.containment).scrollLeft()||0,n+=t(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:s,top:n},this.size=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalSize=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalPosition={left:s,top:n},this.sizeDiff={width:h.outerWidth()-h.width(),height:h.outerHeight()-h.height()},this.originalMousePosition={left:i.pageX,top:i.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,o=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===o?this.axis+"-resize":o),h.addClass("ui-resizable-resizing"),this._propagate("start",i),!0},_mouseDrag:function(e){var i,s=this.helper,n={},o=this.originalMousePosition,a=this.axis,r=this.position.top,h=this.position.left,l=this.size.width,c=this.size.height,u=e.pageX-o.left||0,d=e.pageY-o.top||0,p=this._change[a];return p?(i=p.apply(this,[e,u,d]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),this.position.top!==r&&(n.top=this.position.top+"px"),this.position.left!==h&&(n.left=this.position.left+"px"),this.size.width!==l&&(n.width=this.size.width+"px"),this.size.height!==c&&(n.height=this.size.height+"px"),s.css(n),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(n)||this._trigger("resize",e,this.ui()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&t.ui.hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null,h=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(t){var e,s,n,o,a,r=this.options;a={minWidth:i(r.minWidth)?r.minWidth:0,maxWidth:i(r.maxWidth)?r.maxWidth:1/0,minHeight:i(r.minHeight)?r.minHeight:0,maxHeight:i(r.maxHeight)?r.maxHeight:1/0},(this._aspectRatio||t)&&(e=a.minHeight*this.aspectRatio,n=a.minWidth/this.aspectRatio,s=a.maxHeight*this.aspectRatio,o=a.maxWidth/this.aspectRatio,e>a.minWidth&&(a.minWidth=e),n>a.minHeight&&(a.minHeight=n),a.maxWidth>s&&(a.maxWidth=s),a.maxHeight>o&&(a.maxHeight=o)),this._vBoundaries=a},_updateCache:function(t){this.offset=this.helper.offset(),i(t.left)&&(this.position.left=t.left),i(t.top)&&(this.position.top=t.top),i(t.height)&&(this.size.height=t.height),i(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,s=this.size,n=this.axis;return i(t.height)?t.width=t.height*this.aspectRatio:i(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===n&&(t.left=e.left+(s.width-t.width),t.top=null),"nw"===n&&(t.top=e.top+(s.height-t.height),t.left=e.left+(s.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,s=this.axis,n=i(t.width)&&e.maxWidth&&e.maxWidth<t.width,o=i(t.height)&&e.maxHeight&&e.maxHeight<t.height,a=i(t.width)&&e.minWidth&&e.minWidth>t.width,r=i(t.height)&&e.minHeight&&e.minHeight>t.height,h=this.originalPosition.left+this.originalSize.width,l=this.position.top+this.size.height,c=/sw|nw|w/.test(s),u=/nw|ne|n/.test(s);return a&&(t.width=e.minWidth),r&&(t.height=e.minHeight),n&&(t.width=e.maxWidth),o&&(t.height=e.maxHeight),a&&c&&(t.left=h-e.minWidth),n&&c&&(t.left=h-e.maxWidth),r&&u&&(t.top=l-e.minHeight),o&&u&&(t.top=l-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_proportionallyResize:function(){if(this._proportionallyResizeElements.length){var t,e,i,s,n,o=this.helper||this.element;for(t=0;this._proportionallyResizeElements.length>t;t++){if(n=this._proportionallyResizeElements[t],!this.borderDif)for(this.borderDif=[],i=[n.css("borderTopWidth"),n.css("borderRightWidth"),n.css("borderBottomWidth"),n.css("borderLeftWidth")],s=[n.css("paddingTop"),n.css("paddingRight"),n.css("paddingBottom"),n.css("paddingLeft")],e=0;i.length>e;e++)this.borderDif[e]=(parseInt(i[e],10)||0)+(parseInt(s[e],10)||0);n.css({height:o.height()-this.borderDif[0]-this.borderDif[2]||0,width:o.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).data("ui-resizable"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&t.ui.hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,c=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var i,s,n,o,a,r,h,l=t(this).data("ui-resizable"),c=l.options,u=l.element,d=c.containment,p=d instanceof t?d.get(0):/parent/.test(d)?u.parent().get(0):d;p&&(l.containerElement=t(p),/document/.test(d)||d===document?(l.containerOffset={left:0,top:0},l.containerPosition={left:0,top:0},l.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(i=t(p),s=[],t(["Top","Right","Left","Bottom"]).each(function(t,n){s[t]=e(i.css("padding"+n))}),l.containerOffset=i.offset(),l.containerPosition=i.position(),l.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},n=l.containerOffset,o=l.containerSize.height,a=l.containerSize.width,r=t.ui.hasScroll(p,"left")?p.scrollWidth:a,h=t.ui.hasScroll(p)?p.scrollHeight:o,l.parentData={element:p,left:n.left,top:n.top,width:r,height:h}))},resize:function(e){var i,s,n,o,a=t(this).data("ui-resizable"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio),a.position.top=a._helper?h.top:0),a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top,i=Math.abs((a._helper?a.offset.left-u.left:a.offset.left-u.left)+a.sizeDiff.width),s=Math.abs((a._helper?a.offset.top-u.top:a.offset.top-h.top)+a.sizeDiff.height),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o&&(i-=a.parentData.left),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio))},stop:function(){var e=t(this).data("ui-resizable"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).data("ui-resizable"),i=e.options,s=function(e){t(e).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseInt(e.width(),10),height:parseInt(e.height(),10),left:parseInt(e.css("left"),10),top:parseInt(e.css("top"),10)})})};"object"!=typeof i.alsoResize||i.alsoResize.parentNode?s(i.alsoResize):i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):t.each(i.alsoResize,function(t){s(t)})},resize:function(e,i){var s=t(this).data("ui-resizable"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0},h=function(e,s){t(e).each(function(){var e=t(this),n=t(this).data("ui-resizable-alsoresize"),o={},a=s&&s.length?s:e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(a,function(t,e){var i=(n[e]||0)+(r[e]||0);i&&i>=0&&(o[e]=i||null)}),e.css(o)})};"object"!=typeof n.alsoResize||n.alsoResize.nodeType?h(n.alsoResize):t.each(n.alsoResize,function(t,e){h(t,e)})},stop:function(){t(this).removeData("resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).data("ui-resizable"),i=e.options,s=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).data("ui-resizable");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).data("ui-resizable");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e=t(this).data("ui-resizable"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,a=e.axis,r="number"==typeof i.grid?[i.grid,i.grid]:i.grid,h=r[0]||1,l=r[1]||1,c=Math.round((s.width-n.width)/h)*h,u=Math.round((s.height-n.height)/l)*l,d=n.width+c,p=n.height+u,f=i.maxWidth&&d>i.maxWidth,g=i.maxHeight&&p>i.maxHeight,m=i.minWidth&&i.minWidth>d,v=i.minHeight&&i.minHeight>p;i.grid=r,m&&(d+=h),v&&(p+=l),f&&(d-=h),g&&(p-=l),/^(se|s|e)$/.test(a)?(e.size.width=d,e.size.height=p):/^(ne)$/.test(a)?(e.size.width=d,e.size.height=p,e.position.top=o.top-u):/^(sw)$/.test(a)?(e.size.width=d,e.size.height=p,e.position.left=o.left-c):(e.size.width=d,e.size.height=p,e.position.top=o.top-u,e.position.left=o.left-c)}})}(jQuery),function(t){t.widget("ui.selectable",t.ui.mouse,{version:"1.10.3",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var e,i=this;this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){e=t(i.options.filter,i.element[0]),e.addClass("ui-selectee"),e.each(function(){var e=t(this),i=e.offset();t.data(this,"selectable-item",{element:this,$element:e,left:i.left,top:i.top,right:i.left+e.outerWidth(),bottom:i.top+e.outerHeight(),startselected:!1,selected:e.hasClass("ui-selected"),selecting:e.hasClass("ui-selecting"),unselecting:e.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=e.addClass("ui-selectee"),this._mouseInit(),this.helper=t("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(e){var i=this,s=this.options;this.opos=[e.pageX,e.pageY],this.options.disabled||(this.selectees=t(s.filter,this.element[0]),this._trigger("start",e),t(s.appendTo).append(this.helper),this.helper.css({left:e.pageX,top:e.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=t.data(this,"selectable-item");s.startselected=!0,e.metaKey||e.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",e,{unselecting:s.element}))}),t(e.target).parents().addBack().each(function(){var s,n=t.data(this,"selectable-item");return n?(s=!e.metaKey&&!e.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",e,{selecting:n.element}):i._trigger("unselecting",e,{unselecting:n.element}),!1):undefined}))},_mouseDrag:function(e){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,o=this.opos[0],a=this.opos[1],r=e.pageX,h=e.pageY;return o>r&&(i=r,r=o,o=i),a>h&&(i=h,h=a,a=i),this.helper.css({left:o,top:a,width:r-o,height:h-a}),this.selectees.each(function(){var i=t.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||o>i.right||i.top>h||a>i.bottom):"fit"===n.tolerance&&(l=i.left>o&&r>i.right&&i.top>a&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",e,{selecting:i.element}))):(i.selecting&&((e.metaKey||e.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",e,{unselecting:i.element}))),i.selected&&(e.metaKey||e.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",e,{unselecting:i.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,t(".ui-unselecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",e,{unselected:s.element})}),t(".ui-selecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",e,{selected:s.element})}),this._trigger("stop",e),this.helper.remove(),!1}})}(jQuery),function(t){function e(t,e,i){return t>e&&e+i>t}function i(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))}t.widget("ui.sortable",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_create:function(){var t=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?"x"===t.axis||i(this.items[0].item):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_setOption:function(e,i){"disabled"===e?(this.options[e]=i,this.widget().toggleClass("ui-sortable-disabled",!!i)):t.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):undefined}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("<style>*{ cursor: "+a.cursor+" !important; }</style>").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY<a.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+a.scrollSpeed:e.pageY-this.overflowOffset.top<a.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-a.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-e.pageX<a.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+a.scrollSpeed:e.pageX-this.overflowOffset.left<a.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-a.scrollSpeed)):(e.pageY-t(document).scrollTop()<a.scrollSensitivity?r=t(document).scrollTop(t(document).scrollTop()-a.scrollSpeed):t(window).height()-(e.pageY-t(document).scrollTop())<a.scrollSensitivity&&(r=t(document).scrollTop(t(document).scrollTop()+a.scrollSpeed)),e.pageX-t(document).scrollLeft()<a.scrollSensitivity?r=t(document).scrollLeft(t(document).scrollLeft()-a.scrollSpeed):t(window).width()-(e.pageX-t(document).scrollLeft())<a.scrollSensitivity&&(r=t(document).scrollLeft(t(document).scrollLeft()+a.scrollSpeed))),r!==!1&&t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;</span> <span class='diff-add'>this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var i="x"===this.options.axis||e(this.positionAbs.top+this.offset.click.top,t.top,t.height),s="y"===this.options.axis||e(this.positionAbs.left+this.offset.click.left,t.left,t.width),n=i&&s,o=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return n?this.floating?a&&"right"===a||"down"===o?2:1:o&&("down"===o?2:1):!1},_intersectsWithSides:function(t){var i=e(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),s=e(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),n=this._getDragVerticalDirection(),o=this._getDragHorizontalDirection();return this.floating&&o?"right"===o&&s||"left"===o&&!s:n&&("down"===n&&i||"up"===n&&!i)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){var i,s,n,o,a=[],r=[],h=this._connectWith();if(h&&e)for(i=h.length-1;i>=0;i--)for(n=t(h[i]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&r.push([t.isFunction(o.options.items)?o.options.items.call(o.element):t(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(r.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),i=r.length-1;i>=0;i--)r[i][0].each(function(){a.push(this)});return t(a)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,h,l,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",a),c.push({item:h,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]).addClass(i||e.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tr"===s?e.currentItem.children().each(function(){t("<td> </td>",e.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(n)}):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_contactContainers:function(s){var n,o,a,r,h,l,c,u,d,p,f=null,g=null;for(n=this.containers.length-1;n>=0;n--)if(!t.contains(this.currentItem[0],this.containers[n].element[0]))if(this._intersectsWith(this.containers[n].containerCache)){if(f&&t.contains(this.containers[n].element[0],f.element[0]))continue;f=this.containers[n],g=n}else this.containers[n].containerCache.over&&(this.containers[n]._trigger("out",s,this._uiHash(this)),this.containers[n].containerCache.over=0);if(f)if(1===this.containers.length)this.containers[g].containerCache.over||(this.containers[g]._trigger("over",s,this._uiHash(this)),this.containers[g].containerCache.over=1);else{for(a=1e4,r=null,p=f.floating||i(this.currentItem),h=p?"left":"top",l=p?"width":"height",c=this.positionAbs[h]+this.offset.click[h],o=this.items.length-1;o>=0;o--)t.contains(this.containers[g].element[0],this.items[o].item[0])&&this.items[o].item[0]!==this.currentItem[0]&&(!p||e(this.positionAbs.top+this.offset.click.top,this.items[o].top,this.items[o].height))&&(u=this.items[o].item.offset()[h],d=!1,Math.abs(u-c)>Math.abs(u+this.items[o][l]-c)&&(d=!0,u+=this.items[o][l]),a>Math.abs(u-c)&&(a=Math.abs(u-c),r=this.items[o],this.direction=d?"up":"down"));if(!r&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[g])return;r?this._rearrange(s,r,null,!0):this._rearrange(s,null,this.containers[g].element,!0),this._trigger("change",s,this._uiHash()),this.containers[g]._trigger("change",s,this._uiHash(this)),this.currentContainer=this.containers[g],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[g]._trigger("over",s,this._uiHash(this)),this.containers[g].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,t("document"===n.containment?document:window).width()-this.helperProportions.width-this.margins.left,(t("document"===n.containment?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==document&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.left<this.containment[0]&&(o=this.containment[0]+this.offset.click.left),e.pageY-this.offset.click.top<this.containment[1]&&(a=this.containment[1]+this.offset.click.top),e.pageX-this.offset.click.left>this.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){this.reverting=!1;var i,s=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(i in this._storedCSS)("auto"===this._storedCSS[i]||"static"===this._storedCSS[i])&&(this._storedCSS[i]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&s.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||s.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(s.push(function(t){this._trigger("remove",t,this._uiHash())}),s.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),s.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),i=this.containers.length-1;i>=0;i--)e||s.push(function(t){return function(e){t._trigger("deactivate",e,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over&&(s.push(function(t){return function(e){t._trigger("out",e,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,this.cancelHelperRemoval){if(!e){for(this._trigger("beforeStop",t,this._uiHash()),i=0;s.length>i;i++)s[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!1}if(e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null,!e){for(i=0;s.length>i;i++)s[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}})}(jQuery),function(t,e){var i="ui-effects-";t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=t("<p>")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,h],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof l?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=l(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=l(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(jQuery),function(){function i(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function s(e,i){var s,n,a={};for(s in i)n=i[s],e[s]!==n&&(o[s]||(t.fx.step[s]||!isNaN(parseFloat(n)))&&(a[s]=n));return a}var n=["add","remove","toggle"],o={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(jQuery.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(e,o,a,r){var h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.map(function(){var e=t(this);return{el:e,start:i(this)}}),o=function(){t.each(n,function(t,i){e[i]&&a[i+"Class"](e[i])})},o(),l=l.map(function(){return this.end=i(this.el[0]),this.diff=s(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(i){return function(s,n,o,a,r){return"boolean"==typeof n||n===e?o?t.effects.animateClass.call(this,n?{add:s}:{remove:s},o,a,r):i.apply(this,arguments):t.effects.animateClass.call(this,{toggle:s},n,o,a)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function s(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function n(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}t.extend(t.effects,{version:"1.10.3",save:function(t,e){for(var s=0;e.length>s;s++)null!==e[s]&&t.data(i+e[s],t[0].style[e[s]])},restore:function(t,s){var n,o;for(o=0;s.length>o;o++)null!==s[o]&&(n=t.data(i+s[o]),n===e&&(n=""),t.css(s[o],n))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).focus(),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).focus()),e},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function e(e){function s(){t.isFunction(o)&&o.call(n[0]),t.isFunction(e)&&e()}var n=t(this),o=i.complete,r=i.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),s()):a.call(n[0],i,s)}var i=s.apply(this,arguments),n=i.mode,o=i.queue,a=t.effects.effect[i.effect];return t.fx.off||!a?n?this[n](i.duration,i.complete):this.each(function(){i.complete&&i.complete.call(this)}):o===!1?this.each(e):this.queue(o||"fx",e)},show:function(t){return function(e){if(n(e))return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="show",this.effect.call(this,i)}}(t.fn.show),hide:function(t){return function(e){if(n(e))return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="hide",this.effect.call(this,i)}}(t.fn.hide),toggle:function(t){return function(e){if(n(e)||"boolean"==typeof e)return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="toggle",this.effect.call(this,i)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s}})}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}()}(jQuery),function(t){var e=0,i={},s={};i.height=i.paddingTop=i.paddingBottom=i.borderTopWidth=i.borderBottomWidth="hide",s.height=s.paddingTop=s.paddingBottom=s.borderTopWidth=s.borderBottomWidth="show",t.widget("ui.accordion",{version:"1.10.3",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t(),content:this.active.length?this.active.next():t()}},_createIcons:function(){var e=this.options.icons;e&&(t("<span>").addClass("ui-accordion-header-icon ui-icon "+e.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(e.header).addClass(e.activeHeader),this.headers.addClass("ui-accordion-icons"))</span> <span class='diff-add'>},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),undefined):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),"disabled"===t&&this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!e),undefined)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),o.focus(),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().focus()},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all"),this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide()},_refresh:function(){var i,s=this.options,n=s.heightStyle,o=this.element.parent(),a=this.accordionId="ui-accordion-"+(this.element.attr("id")||++e);this.active=this._findActive(s.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(e){var i=t(this),s=i.attr("id"),n=i.next(),o=n.attr("id");s||(s=a+"-header-"+e,i.attr("id",s)),o||(o=a+"-panel-"+e,n.attr("id",o)),i.attr("aria-controls",o),n.attr("aria-labelledby",s)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false",tabIndex:-1}).next().attr({"aria-expanded":"false","aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true",tabIndex:0}).next().attr({"aria-expanded":"true","aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(s.event),"fill"===n?(i=o.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.headers.each(function(){i-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===n&&(i=0,this.headers.next().each(function(){i=Math.max(i,t(this).css("height","").height())}).height(i))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n[0]===s[0],a=o&&i.collapsible,r=a?t():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:a?t():n,newPanel:r};e.preventDefault(),o&&!i.collapsible||this._trigger("beforeActivate",e,l)===!1||(i.active=a?!1:this.headers.index(n),this.active=o?t():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),o||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-expanded":"false","aria-hidden":"true"}),s.prev().attr("aria-selected","false"),i.length&&s.length?s.prev().attr("tabIndex",-1):i.length&&this.headers.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),i.attr({"aria-expanded":"true","aria-hidden":"false"}).prev().attr({"aria-selected":"true",tabIndex:0})},_animate:function(t,e,n){var o,a,r,h=this,l=0,c=t.length&&(!e.length||t.index()<e.index()),u=this.options.animate||{},d=c&&u.down||u,p=function(){h._toggleComplete(n)};return"number"==typeof d&&(r=d),"string"==typeof d&&(a=d),a=a||d.easing||u.easing,r=r||d.duration||u.duration,e.length?t.length?(o=t.show().outerHeight(),e.animate(i,{duration:r,easing:a,step:function(t,e){e.now=Math.round(t)}}),t.hide().animate(s,{duration:r,easing:a,complete:p,step:function(t,i){i.now=Math.round(t),"height"!==i.prop?l+=i.now:"content"!==h.options.heightStyle&&(i.now=Math.round(o-e.outerHeight()-l),l=0)}}),undefined):e.animate(i,r,a,p):t.animate(s,r,a,p)},_toggleComplete:function(t){var e=t.oldPanel;e.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),e.length&&(e.parent()[0].className=e.parent()[0].className),this._trigger("activate",null,t)}})}(jQuery),function(t){var e=0;t.widget("ui.autocomplete",{version:"1.10.3",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o?!0:a?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,undefined;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:case o.NUMPAD_ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),undefined;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),undefined):(this._searchTimeout(t),undefined)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,undefined):(clearTimeout(this.searching),this.close(t),this._change(t),undefined)}}),this._initSource(),this.menu=t("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().data("ui-menu"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];t(e.target).closest(".ui-menu-item").length||this._delay(function(){var e=this;this.document.one("mousedown",function(s){s.target===e.element[0]||s.target===i||t.contains(i,s.target)||e.close()})})},menufocus:function(e,i){if(this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type)))return this.menu.blur(),this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)}),undefined;var s=i.item.data("ui-autocomplete-item");!1!==this._trigger("focus",e,{item:s})?e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(s.value):this.liveRegion.text(s.value)},menuselect:function(t,e){var i=e.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",t,{item:i})&&this._value(i.value),this.term=this._value(),this.close(t),this.selectedItem=i}}),this.liveRegion=t("<span>",{role:"status","aria-live":"polite"}).addClass("ui-helper-hidden-accessible").insertBefore(this.element),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e||(e=this.element.closest(".ui-front")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,s=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,s){s(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,n){s.xhr&&s.xhr.abort(),s.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){n(t)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){this.term!==this._value()&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length<this.options.minLength?this.close(e):this._trigger("search",e)!==!1?this._search(t):undefined},_search:function(t){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:t},this._response())},_response:function(){var t=this,i=++e;return function(s){i===e&&t.__response(s),t.pending--,t.pending||t.element.removeClass("ui-autocomplete-loading")}},__response:function(t){t&&(t=this._normalize(t)),this._trigger("response",null,{content:t}),!this.options.disabled&&t&&t.length&&!this.cancelSearch?(this._suggest(t),this._trigger("open")):this._close()},close:function(t){this.cancelSearch=!0,this._close(t)},_close:function(t){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",t))},_change:function(t){this.previous!==this._value()&&this._trigger("change",t,{item:this.selectedItem})},_normalize:function(e){return e.length&&e[0].label&&e[0].value?e:t.map(e,function(e){return"string"==typeof e?{label:e,value:e}:t.extend({label:e.label||e.value,value:e.value||e.label},e)})},_suggest:function(e){var i=this.menu.element.empty();this._renderMenu(i,e),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(t.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var t=this.menu.element;t.outerWidth(Math.max(t.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(e,i){var s=this;t.each(i,function(t,i){s._renderItemData(e,i)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-autocomplete-item",e)},_renderItem:function(e,i){return t("<li>").append(t("<a>").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this._value(this.term),this.menu.blur(),undefined):(this.menu[t](e),undefined):(this.search(null,e),undefined)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var e;this._superApply(arguments),this.options.disabled||this.cancelSearch||(e=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.text(e))}})}(jQuery),function(t){var e,i,s,n,o="ui-button ui-widget ui-state-default ui-corner-all",a="ui-state-hover ui-state-active ",r="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",h=function(){var e=t(this);setTimeout(function(){e.find(":ui-button").button("refresh")},1)},l=function(e){var i=e.name,s=e.form,n=t([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?t(s).find("[name='"+i+"']"):t("[name='"+i+"']",e.ownerDocument).filter(function(){return!this.form})),n};t.widget("ui.button",{version:"1.10.3",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,h),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var a=this,r=this.options,c="checkbox"===this.type||"radio"===this.type,u=c?"":"ui-state-active",d="ui-state-focus";null===r.label&&(r.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(o).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){r.disabled||this===e&&t(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){r.disabled||t(this).removeClass(u)}).bind("click"+this.eventNamespace,function(t){r.disabled&&(t.preventDefault(),t.stopImmediatePropagation())}),this.element.bind("focus"+this.eventNamespace,function(){a.buttonElement.addClass(d)}).bind("blur"+this.eventNamespace,function(){a.buttonElement.removeClass(d)}),c&&(this.element.bind("change"+this.eventNamespace,function(){n||a.refresh()}),this.buttonElement.bind("mousedown"+this.eventNamespace,function(t){r.disabled||(n=!1,i=t.pageX,s=t.pageY)}).bind("mouseup"+this.eventNamespace,function(t){r.disabled||(i!==t.pageX||s!==t.pageY)&&(n=!0)})),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return r.disabled||n?!1:undefined}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(r.disabled||n)return!1;t(this).addClass("ui-state-active"),a.buttonElement.attr("aria-pressed","true");var e=a.element[0];l(e).not(e).map(function(){return t(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return r.disabled?!1:(t(this).addClass("ui-state-active"),e=this,a.document.one("mouseup",function(){e=null}),undefined)}).bind("mouseup"+this.eventNamespace,function(){return r.disabled?!1:(t(this).removeClass("ui-state-active"),undefined)}).bind("keydown"+this.eventNamespace,function(e){return r.disabled?!1:((e.keyCode===t.ui.keyCode.SPACE||e.keyCode===t.ui.keyCode.ENTER)&&t(this).addClass("ui-state-active"),undefined)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){t(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(e){e.keyCode===t.ui.keyCode.SPACE&&t(this).click()})),this._setOption("disabled",r.disabled),this._resetButton()},_determineButtonType:function(){var t,e,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(t=this.element.parents().last(),e="label[for='"+this.element.attr("id")+"']",this.buttonElement=t.find(e),this.buttonElement.length||(t=t.length?t.siblings():this.element.siblings(),this.buttonElement=t.filter(e),this.buttonElement.length||(this.buttonElement=t.find(e))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(o+" "+a+" "+r).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(t,e){return this._super(t,e),"disabled"===t?(e?this.element.prop("disabled",!0):this.element.prop("disabled",!1),undefined):(this._resetButton(),undefined)},refresh:function(){var e=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");e!==this.options.disabled&&this._setOption("disabled",e),"radio"===this.type?l(this.element[0]).each(function(){t(this).is(":checked")?t(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):t(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),undefined;var e=this.buttonElement.removeClass(r),i=t("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(e.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,o=[];s.primary||s.secondary?(this.options.text&&o.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&e.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&e.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(o.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||e.attr("title",t.trim(i)))):o.push("ui-button-text-only"),e.addClass(o.join(" "))}}),t.widget("ui.buttonset",{version:"1.10.3",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(t,e){"disabled"===t&&this.buttons.button("option",t,e),this._super(t,e)},refresh:function(){var e="rtl"===this.element.css("direction");this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return t(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(e?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(e?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return t(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}})}(jQuery),function(t,e){function i(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[""]),this.dpDiv=s(t("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function s(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.delegate(i,"mouseout",function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",function(){t.datepicker._isDisabledDatepicker(o.inline?e.parent()[0]:o.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))})}function n(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}t.extend(t.ui,{datepicker:{version:"1.10.3"}});var o,a="datepicker";t.extend(i.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(t){return n(this._defaults,t||{}),this},_attachDatepicker:function(e,i){var s,n,o;s=e.nodeName.toLowerCase(),n="div"===s||"span"===s,e.id||(this.uuid+=1,e.id="dp"+this.uuid),o=this._newInst(t(e),n),o.settings=t.extend({},i||{}),"input"===s?this._connectDatepicker(e,o):n&&this._inlineDatepicker(e,o)},_newInst:function(e,i){var n=e[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:n,input:e,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?s(t("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(e,i){var s=t(e);i.append=t([]),i.trigger=t([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),t.data(e,a,i),i.settings.disabled&&this._disableDatepicker(e))},_attachments:function(e,i){var s,n,o,a=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),a&&(i.append=t("<span class='"+this._appendClass+"'>"+a+"</span>"),e[r?"before":"after"](i.append)),e.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&e.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),o=this._get(i,"buttonImage"),i.trigger=t(this._get(i,"buttonImageOnly")?t("<img/>").addClass(this._triggerClass).attr({src:o,alt:n,title:n}):t("<button type='button'></button>").addClass(this._triggerClass).html(o?t("<img/>").attr({src:o,alt:n,title:n}):n)),e[r?"before":"after"](i.trigger),i.trigger.click(function(){return t.datepicker._datepickerShowing&&t.datepicker._lastInput===e[0]?t.datepicker._hideDatepicker():t.datepicker._datepickerShowing&&t.datepicker._lastInput!==e[0]?(t.datepicker._hideDatepicker(),t.datepicker._showDatepicker(e[0])):t.datepicker._showDatepicker(e[0]),!1}))},_autoSize:function(t){if(this._get(t,"autoSize")&&!t.inline){var e,i,s,n,o=new Date(2009,11,20),a=this._get(t,"dateFormat");a.match(/[DM]/)&&(e=function(t){for(i=0,s=0,n=0;t.length>n;n++)t[n].length>i&&(i=t[n].length,s=n);return s},o.setMonth(e(this._get(t,a.match(/MM/)?"monthNames":"monthNamesShort"))),o.setDate(e(this._get(t,a.match(/DD/)?"dayNames":"dayNamesShort"))+20-o.getDay())),t.input.attr("size",this._formatDate(t,o).length)}},_inlineDatepicker:function(e,i){var s=t(e);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),t.data(e,a,i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(e),i.dpDiv.css("display","block"))},_dialogDatepicker:function(e,i,s,o,r){var h,l,c,u,d,p=this._dialogInst;return p||(this.uuid+=1,h="dp"+this.uuid,this._dialogInput=t("<input type='text' id='"+h+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),t("body").append(this._dialogInput),p=this._dialogInst=this._newInst(this._dialogInput,!1),p.settings={},t.data(this._dialogInput[0],a,p)),n(p.settings,o||{}),i=i&&i.constructor===Date?this._formatDate(p,i):i,this._dialogInput.val(i),this._pos=r?r.length?r:[r.pageX,r.pageY]:null,this._pos||(l=document.documentElement.clientWidth,c=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[l/2-100+u,c/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),p.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),t.blockUI&&t.blockUI(this.dpDiv),t.data(this._dialogInput[0],a,p),this},_destroyDatepicker:function(e){var i,s=t(e),n=t.data(e,a);s.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),t.removeData(e,a),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty())},_enableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,a);n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!1,o.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,a);n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!0,o.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){if(!t)return!1;for(var e=0;this._disabledInputs.length>e;e++)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(e){try{return t.data(e,a)}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(i,s,o){var a,r,h,l,c=this._getInst(i);return 2===arguments.length&&"string"==typeof s?"defaults"===s?t.extend({},t.datepicker._defaults):c?"all"===s?t.extend({},c.settings):this._get(c,s):null:(a=s||{},"string"==typeof s&&(a={},a[s]=o),c&&(this._curInst===c&&this._hideDatepicker(),r=this._getDateDatepicker(i,!0),h=this._getMinMaxDate(c,"min"),l=this._getMinMaxDate(c,"max"),n(c.settings,a),null!==h&&a.dateFormat!==e&&a.minDate===e&&(c.settings.minDate=this._formatDate(c,h)),null!==l&&a.dateFormat!==e&&a.maxDate===e&&(c.settings.maxDate=this._formatDate(c,l)),"disabled"in a&&(a.disabled?this._disableDatepicker(i):this._enableDatepicker(i)),this._attachments(t(i),c),this._autoSize(c),this._setDate(c,r),this._updateAlternate(c),this._updateDatepicker(c)),e)},_changeDatepicker:function(t,e,i){this._optionDatepicker(t,e,i)},_refreshDatepicker:function(t){var e=this._getInst(t);e&&this._updateDatepicker(e)},_setDateDatepicker:function(t,e){var i=this._getInst(t);i&&(this._setDate(i,e),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(t,e){var i=this._getInst(t);return i&&!i.inline&&this._setDateFromField(i,e),i?this._getDate(i):null},_doKeyDown:function(e){var i,s,n,o=t.datepicker._getInst(e.target),a=!0,r=o.dpDiv.is(".ui-datepicker-rtl");if(o._keyEvent=!0,t.datepicker._datepickerShowing)switch(e.keyCode){case 9:t.datepicker._hideDatepicker(),a=!1;break;case 13:return n=t("td."+t.datepicker._dayOverClass+":not(."+t.datepicker._currentClass+")",o.dpDiv),n[0]&&t.datepicker._selectDay(e.target,o.selectedMonth,o.selectedYear,n[0]),i=t.datepicker._get(o,"onSelect"),i?(s=t.datepicker._formatDate(o),i.apply(o.input?o.input[0]:null,[s,o])):t.datepicker._hideDatepicker(),!1;</span> <span class='diff-add'>case 27:t.datepicker._hideDatepicker();break;case 33:t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 34:t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 35:(e.ctrlKey||e.metaKey)&&t.datepicker._clearDate(e.target),a=e.ctrlKey||e.metaKey;break;case 36:(e.ctrlKey||e.metaKey)&&t.datepicker._gotoToday(e.target),a=e.ctrlKey||e.metaKey;break;case 37:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?1:-1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 38:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,-7,"D"),a=e.ctrlKey||e.metaKey;break;case 39:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?-1:1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 40:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,7,"D"),a=e.ctrlKey||e.metaKey;break;default:a=!1}else 36===e.keyCode&&e.ctrlKey?t.datepicker._showDatepicker(this):a=!1;a&&(e.preventDefault(),e.stopPropagation())},_doKeyPress:function(i){var s,n,o=t.datepicker._getInst(i.target);return t.datepicker._get(o,"constrainInput")?(s=t.datepicker._possibleChars(t.datepicker._get(o,"dateFormat")),n=String.fromCharCode(null==i.charCode?i.keyCode:i.charCode),i.ctrlKey||i.metaKey||" ">n||!s||s.indexOf(n)>-1):e},_doKeyUp:function(e){var i,s=t.datepicker._getInst(e.target);if(s.input.val()!==s.lastVal)try{i=t.datepicker.parseDate(t.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,t.datepicker._getFormatConfig(s)),i&&(t.datepicker._setDateFromField(s),t.datepicker._updateAlternate(s),t.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(e){if(e=e.target||e,"input"!==e.nodeName.toLowerCase()&&(e=t("input",e.parentNode)[0]),!t.datepicker._isDisabledDatepicker(e)&&t.datepicker._lastInput!==e){var i,s,o,a,r,h,l;i=t.datepicker._getInst(e),t.datepicker._curInst&&t.datepicker._curInst!==i&&(t.datepicker._curInst.dpDiv.stop(!0,!0),i&&t.datepicker._datepickerShowing&&t.datepicker._hideDatepicker(t.datepicker._curInst.input[0])),s=t.datepicker._get(i,"beforeShow"),o=s?s.apply(e,[e,i]):{},o!==!1&&(n(i.settings,o),i.lastVal=null,t.datepicker._lastInput=e,t.datepicker._setDateFromField(i),t.datepicker._inDialog&&(e.value=""),t.datepicker._pos||(t.datepicker._pos=t.datepicker._findPos(e),t.datepicker._pos[1]+=e.offsetHeight),a=!1,t(e).parents().each(function(){return a|="fixed"===t(this).css("position"),!a}),r={left:t.datepicker._pos[0],top:t.datepicker._pos[1]},t.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),t.datepicker._updateDatepicker(i),r=t.datepicker._checkOffset(i,r,a),i.dpDiv.css({position:t.datepicker._inDialog&&t.blockUI?"static":a?"fixed":"absolute",display:"none",left:r.left+"px",top:r.top+"px"}),i.inline||(h=t.datepicker._get(i,"showAnim"),l=t.datepicker._get(i,"duration"),i.dpDiv.zIndex(t(e).zIndex()+1),t.datepicker._datepickerShowing=!0,t.effects&&t.effects.effect[h]?i.dpDiv.show(h,t.datepicker._get(i,"showOptions"),l):i.dpDiv[h||"show"](h?l:null),t.datepicker._shouldFocusInput(i)&&i.input.focus(),t.datepicker._curInst=i))}},_updateDatepicker:function(e){this.maxRows=4,o=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e),e.dpDiv.find("."+this._dayOverClass+" a").mouseover();var i,s=this._getNumberOfMonths(e),n=s[1],a=17;e.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&e.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),e.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),e.dpDiv[(this._get(e,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),e===t.datepicker._curInst&&t.datepicker._datepickerShowing&&t.datepicker._shouldFocusInput(e)&&e.input.focus(),e.yearshtml&&(i=e.yearshtml,setTimeout(function(){i===e.yearshtml&&e.yearshtml&&e.dpDiv.find("select.ui-datepicker-year:first").replaceWith(e.yearshtml),i=e.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(e,i,s){var n=e.dpDiv.outerWidth(),o=e.dpDiv.outerHeight(),a=e.input?e.input.outerWidth():0,r=e.input?e.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:t(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:t(document).scrollTop());return i.left-=this._get(e,"isRTL")?n-a:0,i.left-=s&&i.left===e.input.offset().left?t(document).scrollLeft():0,i.top-=s&&i.top===e.input.offset().top+r?t(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+o>l&&l>o?Math.abs(o+r):0),i},_findPos:function(e){for(var i,s=this._getInst(e),n=this._get(s,"isRTL");e&&("hidden"===e.type||1!==e.nodeType||t.expr.filters.hidden(e));)e=e[n?"previousSibling":"nextSibling"];return i=t(e).offset(),[i.left,i.top]},_hideDatepicker:function(e){var i,s,n,o,r=this._curInst;!r||e&&r!==t.data(e,a)||this._datepickerShowing&&(i=this._get(r,"showAnim"),s=this._get(r,"duration"),n=function(){t.datepicker._tidyDialog(r)},t.effects&&(t.effects.effect[i]||t.effects[i])?r.dpDiv.hide(i,t.datepicker._get(r,"showOptions"),s,n):r.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,o=this._get(r,"onClose"),o&&o.apply(r.input?r.input[0]:null,[r.input?r.input.val():"",r]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),t.blockUI&&(t.unblockUI(),t("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(e){if(t.datepicker._curInst){var i=t(e.target),s=t.datepicker._getInst(i[0]);(i[0].id!==t.datepicker._mainDivId&&0===i.parents("#"+t.datepicker._mainDivId).length&&!i.hasClass(t.datepicker.markerClassName)&&!i.closest("."+t.datepicker._triggerClass).length&&t.datepicker._datepickerShowing&&(!t.datepicker._inDialog||!t.blockUI)||i.hasClass(t.datepicker.markerClassName)&&t.datepicker._curInst!==s)&&t.datepicker._hideDatepicker()}},_adjustDate:function(e,i,s){var n=t(e),o=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(o,i+("M"===s?this._get(o,"showCurrentAtPos"):0),s),this._updateDatepicker(o))},_gotoToday:function(e){var i,s=t(e),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(e,i,s){var n=t(e),o=this._getInst(n[0]);o["selected"+("M"===s?"Month":"Year")]=o["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(o),this._adjustDate(n)},_selectDay:function(e,i,s,n){var o,a=t(e);t(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(a[0])||(o=this._getInst(a[0]),o.selectedDay=o.currentDay=t("a",n).html(),o.selectedMonth=o.currentMonth=i,o.selectedYear=o.currentYear=s,this._selectDate(e,this._formatDate(o,o.currentDay,o.currentMonth,o.currentYear)))},_clearDate:function(e){var i=t(e);this._selectDate(i,"")},_selectDate:function(e,i){var s,n=t(e),o=this._getInst(n[0]);i=null!=i?i:this._formatDate(o),o.input&&o.input.val(i),this._updateAlternate(o),s=this._get(o,"onSelect"),s?s.apply(o.input?o.input[0]:null,[i,o]):o.input&&o.input.trigger("change"),o.inline?this._updateDatepicker(o):(this._hideDatepicker(),this._lastInput=o.input[0],"object"!=typeof o.input[0]&&o.input.focus(),this._lastInput=null)},_updateAlternate:function(e){var i,s,n,o=this._get(e,"altField");o&&(i=this._get(e,"altFormat")||this._get(e,"dateFormat"),s=this._getDate(e),n=this.formatDate(i,s,this._getFormatConfig(e)),t(o).each(function(){t(this).val(n)}))},noWeekends:function(t){var e=t.getDay();return[e>0&&6>e,""]},iso8601Week:function(t){var e,i=new Date(t.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),e=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((e-i)/864e5)/7)+1},parseDate:function(i,s,n){if(null==i||null==s)throw"Invalid arguments";if(s="object"==typeof s?""+s:s+"",""===s)return null;var o,a,r,h,l=0,c=(n?n.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof c?c:(new Date).getFullYear()%100+parseInt(c,10),d=(n?n.dayNamesShort:null)||this._defaults.dayNamesShort,p=(n?n.dayNames:null)||this._defaults.dayNames,f=(n?n.monthNamesShort:null)||this._defaults.monthNamesShort,g=(n?n.monthNames:null)||this._defaults.monthNames,m=-1,v=-1,_=-1,b=-1,y=!1,w=function(t){var e=i.length>o+1&&i.charAt(o+1)===t;return e&&o++,e},k=function(t){var e=w(t),i="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,n=RegExp("^\\d{1,"+i+"}"),o=s.substring(l).match(n);if(!o)throw"Missing number at position "+l;return l+=o[0].length,parseInt(o[0],10)},x=function(i,n,o){var a=-1,r=t.map(w(i)?o:n,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(t.each(r,function(t,i){var n=i[1];return s.substr(l,n.length).toLowerCase()===n.toLowerCase()?(a=i[0],l+=n.length,!1):e}),-1!==a)return a+1;throw"Unknown name at position "+l},D=function(){if(s.charAt(l)!==i.charAt(o))throw"Unexpected literal at position "+l;l++};for(o=0;i.length>o;o++)if(y)"'"!==i.charAt(o)||w("'")?D():y=!1;else switch(i.charAt(o)){case"d":_=k("d");break;case"D":x("D",d,p);break;case"o":b=k("o");break;case"m":v=k("m");break;case"M":v=x("M",f,g);break;case"y":m=k("y");break;case"@":h=new Date(k("@")),m=h.getFullYear(),v=h.getMonth()+1,_=h.getDate();break;case"!":h=new Date((k("!")-this._ticksTo1970)/1e4),m=h.getFullYear(),v=h.getMonth()+1,_=h.getDate();break;case"'":w("'")?D():y=!0;break;default:D()}if(s.length>l&&(r=s.substr(l),!/^\s+/.test(r)))throw"Extra/unparsed characters found in date: "+r;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),b>-1)for(v=1,_=b;;){if(a=this._getDaysInMonth(m,v-1),a>=_)break;v++,_-=a}if(h=this._daylightSavingAdjust(new Date(m,v-1,_)),h.getFullYear()!==m||h.getMonth()+1!==v||h.getDate()!==_)throw"Invalid date";return h},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(t,e,i){if(!e)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,o=(i?i.dayNames:null)||this._defaults.dayNames,a=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(e){var i=t.length>s+1&&t.charAt(s+1)===e;return i&&s++,i},l=function(t,e,i){var s=""+e;if(h(t))for(;i>s.length;)s="0"+s;return s},c=function(t,e,i,s){return h(t)?s[e]:i[e]},u="",d=!1;if(e)for(s=0;t.length>s;s++)if(d)"'"!==t.charAt(s)||h("'")?u+=t.charAt(s):d=!1;else switch(t.charAt(s)){case"d":u+=l("d",e.getDate(),2);break;case"D":u+=c("D",e.getDay(),n,o);break;case"o":u+=l("o",Math.round((new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5),3);break;case"m":u+=l("m",e.getMonth()+1,2);break;case"M":u+=c("M",e.getMonth(),a,r);break;case"y":u+=h("y")?e.getFullYear():(10>e.getYear()%100?"0":"")+e.getYear()%100;break;case"@":u+=e.getTime();break;case"!":u+=1e4*e.getTime()+this._ticksTo1970;break;case"'":h("'")?u+="'":d=!0;break;default:u+=t.charAt(s)}return u},_possibleChars:function(t){var e,i="",s=!1,n=function(i){var s=t.length>e+1&&t.charAt(e+1)===i;return s&&e++,s};for(e=0;t.length>e;e++)if(s)"'"!==t.charAt(e)||n("'")?i+=t.charAt(e):s=!1;else switch(t.charAt(e)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=t.charAt(e)}return i},_get:function(t,i){return t.settings[i]!==e?t.settings[i]:this._defaults[i]},_setDateFromField:function(t,e){if(t.input.val()!==t.lastVal){var i=this._get(t,"dateFormat"),s=t.lastVal=t.input?t.input.val():null,n=this._getDefaultDate(t),o=n,a=this._getFormatConfig(t);try{o=this.parseDate(i,s,a)||n}catch(r){s=e?"":s}t.selectedDay=o.getDate(),t.drawMonth=t.selectedMonth=o.getMonth(),t.drawYear=t.selectedYear=o.getFullYear(),t.currentDay=s?o.getDate():0,t.currentMonth=s?o.getMonth():0,t.currentYear=s?o.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(e,i,s){var n=function(t){var e=new Date;return e.setDate(e.getDate()+t),e},o=function(i){try{return t.datepicker.parseDate(t.datepicker._get(e,"dateFormat"),i,t.datepicker._getFormatConfig(e))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?t.datepicker._getDate(e):null)||new Date,o=n.getFullYear(),a=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":a+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a));break;case"y":case"Y":o+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a))}l=h.exec(i)}return new Date(o,a,r)},a=null==i||""===i?s:"string"==typeof i?o(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return a=a&&"Invalid Date"==""+a?s:a,a&&(a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)),this._daylightSavingAdjust(a)},_daylightSavingAdjust:function(t){return t?(t.setHours(t.getHours()>12?t.getHours()+2:0),t):null},_setDate:function(t,e,i){var s=!e,n=t.selectedMonth,o=t.selectedYear,a=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.selectedDay=t.currentDay=a.getDate(),t.drawMonth=t.selectedMonth=t.currentMonth=a.getMonth(),t.drawYear=t.selectedYear=t.currentYear=a.getFullYear(),n===t.selectedMonth&&o===t.selectedYear||i||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(s?"":this._formatDate(t))},_getDate:function(t){var e=!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return e},_attachHandlers:function(e){var i=this._get(e,"stepMonths"),s="#"+e.id.replace(/\\\\/g,"\\");e.dpDiv.find("[data-handler]").map(function(){var e={prev:function(){t.datepicker._adjustDate(s,-i,"M")},next:function(){t.datepicker._adjustDate(s,+i,"M")},hide:function(){t.datepicker._hideDatepicker()},today:function(){t.datepicker._gotoToday(s)},selectDay:function(){return t.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return t.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return t.datepicker._selectMonthYear(s,this,"Y"),!1}};t(this).bind(this.getAttribute("data-event"),e[this.getAttribute("data-handler")])})},_generateHTML:function(t){var e,i,s,n,o,a,r,h,l,c,u,d,p,f,g,m,v,_,b,y,w,k,x,D,C,I,P,T,M,S,z,A,H,E,N,W,O,F,R,L=new Date,j=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(t,"isRTL"),B=this._get(t,"showButtonPanel"),V=this._get(t,"hideIfNoPrevNext"),K=this._get(t,"navigationAsDateFormat"),U=this._getNumberOfMonths(t),q=this._get(t,"showCurrentAtPos"),Q=this._get(t,"stepMonths"),X=1!==U[0]||1!==U[1],$=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),G=this._getMinMaxDate(t,"min"),J=this._getMinMaxDate(t,"max"),Z=t.drawMonth-q,te=t.drawYear;if(0>Z&&(Z+=12,te--),J)for(e=this._daylightSavingAdjust(new Date(J.getFullYear(),J.getMonth()-U[0]*U[1]+1,J.getDate())),e=G&&G>e?G:e;this._daylightSavingAdjust(new Date(te,Z,1))>e;)Z--,0>Z&&(Z=11,te--);for(t.drawMonth=Z,t.drawYear=te,i=this._get(t,"prevText"),i=K?this.formatDate(i,this._daylightSavingAdjust(new Date(te,Z-Q,1)),this._getFormatConfig(t)):i,s=this._canAdjustMonth(t,-1,te,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":V?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(t,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(te,Z+Q,1)),this._getFormatConfig(t)):n,o=this._canAdjustMonth(t,1,te,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":V?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",a=this._get(t,"currentText"),r=this._get(t,"gotoCurrent")&&t.currentDay?$:j,a=K?this.formatDate(a,r,this._getFormatConfig(t)):a,h=t.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(t,"closeText")+"</button>",l=B?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(t,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+a+"</button>":"")+(Y?"":h)+"</div>":"",c=parseInt(this._get(t,"firstDay"),10),c=isNaN(c)?0:c,u=this._get(t,"showWeek"),d=this._get(t,"dayNames"),p=this._get(t,"dayNamesMin"),f=this._get(t,"monthNames"),g=this._get(t,"monthNamesShort"),m=this._get(t,"beforeShowDay"),v=this._get(t,"showOtherMonths"),_=this._get(t,"selectOtherMonths"),b=this._getDefaultDate(t),y="",k=0;U[0]>k;k++){for(x="",this.maxRows=4,D=0;U[1]>D;D++){if(C=this._daylightSavingAdjust(new Date(te,Z,t.selectedDay)),I=" ui-corner-all",P="",X){if(P+="<div class='ui-datepicker-group",U[1]>1)switch(D){case 0:P+=" ui-datepicker-group-first",I=" ui-corner-"+(Y?"right":"left");break;case U[1]-1:P+=" ui-datepicker-group-last",I=" ui-corner-"+(Y?"left":"right");break;default:P+=" ui-datepicker-group-middle",I=""}P+="'>"}for(P+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+I+"'>"+(/all|left/.test(I)&&0===k?Y?o:s:"")+(/all|right/.test(I)&&0===k?Y?s:o:"")+this._generateMonthYearHeader(t,Z,te,G,J,k>0||D>0,f,g)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",T=u?"<th class='ui-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",w=0;7>w;w++)M=(w+c)%7,T+="<th"+((w+c+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+d[M]+"'>"+p[M]+"</span></th>";for(P+=T+"</tr></thead><tbody>",S=this._getDaysInMonth(te,Z),te===t.selectedYear&&Z===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,S)),z=(this._getFirstDayOfMonth(te,Z)-c+7)%7,A=Math.ceil((z+S)/7),H=X?this.maxRows>A?this.maxRows:A:A,this.maxRows=H,E=this._daylightSavingAdjust(new Date(te,Z,1-z)),N=0;H>N;N++){for(P+="<tr>",W=u?"<td class='ui-datepicker-week-col'>"+this._get(t,"calculateWeek")(E)+"</td>":"",w=0;7>w;w++)O=m?m.apply(t.input?t.input[0]:null,[E]):[!0,""],F=E.getMonth()!==Z,R=F&&!_||!O[0]||G&&G>E||J&&E>J,W+="<td class='"+((w+c+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(E.getTime()===C.getTime()&&Z===t.selectedMonth&&t._keyEvent||b.getTime()===E.getTime()&&b.getTime()===C.getTime()?" "+this._dayOverClass:"")+(R?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!v?"":" "+O[1]+(E.getTime()===$.getTime()?" "+this._currentClass:"")+(E.getTime()===j.getTime()?" ui-datepicker-today":""))+"'"+(F&&!v||!O[2]?"":" title='"+O[2].replace(/'/g,"'")+"'")+(R?"":" data-handler='selectDay' data-event='click' data-month='"+E.getMonth()+"' data-year='"+E.getFullYear()+"'")+">"+(F&&!v?" ":R?"<span class='ui-state-default'>"+E.getDate()+"</span>":"<a class='ui-state-default"+(E.getTime()===j.getTime()?" ui-state-highlight":"")+(E.getTime()===$.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+"' href='#'>"+E.getDate()+"</a>")+"</td>",E.setDate(E.getDate()+1),E=this._daylightSavingAdjust(E);P+=W+"</tr>"}Z++,Z>11&&(Z=0,te++),P+="</tbody></table>"+(X?"</div>"+(U[0]>0&&D===U[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),x+=P}y+=x}return y+=l,t._keyEvent=!1,y},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var h,l,c,u,d,p,f,g,m=this._get(t,"changeMonth"),v=this._get(t,"changeYear"),_=this._get(t,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",y="";if(o||!m)y+="<span class='ui-datepicker-month'>"+a[e]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,y+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",c=0;12>c;c++)(!h||c>=s.getMonth())&&(!l||n.getMonth()>=c)&&(y+="<option value='"+c+"'"+(c===e?" selected='selected'":"")+">"+r[c]+"</option>");y+="</select>"}if(_||(b+=y+(!o&&m&&v?"":" ")),!t.yearshtml)if(t.yearshtml="",o||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(u=this._get(t,"yearRange").split(":"),d=(new Date).getFullYear(),p=function(t){var e=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?d+parseInt(t,10):parseInt(t,10);return isNaN(e)?d:e},f=p(u[0]),g=Math.max(f,p(u[1]||"")),f=s?Math.max(f,s.getFullYear()):f,g=n?Math.min(g,n.getFullYear()):g,t.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";g>=f;f++)t.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";t.yearshtml+="</select>",b+=t.yearshtml,t.yearshtml=null}return b+=this._get(t,"yearSuffix"),_&&(b+=(!o&&m&&v?"":" ")+y),b+="</div>"},_adjustInstDate:function(t,e,i){var s=t.drawYear+("Y"===i?e:0),n=t.drawMonth+("M"===i?e:0),o=Math.min(t.selectedDay,this._getDaysInMonth(s,n))+("D"===i?e:0),a=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(s,n,o)));t.selectedDay=a.getDate(),t.drawMonth=t.selectedMonth=a.getMonth(),t.drawYear=t.selectedYear=a.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=i&&i>e?i:e;return s&&n>s?s:n},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){var e=this._get(t,"numberOfMonths");return null==e?[1,1]:"number"==typeof e?[1,e]:e},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,s){var n=this._getNumberOfMonths(t),o=this._daylightSavingAdjust(new Date(i,s+(0>e?e:n[0]*n[1]),1));return 0>e&&o.setDate(this._getDaysInMonth(o.getFullYear(),o.getMonth())),this._isInRange(t,o)},_isInRange:function(t,e){var i,s,n=this._getMinMaxDate(t,"min"),o=this._getMinMaxDate(t,"max"),a=null,r=null,h=this._get(t,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),a=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(a+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||e.getTime()>=n.getTime())&&(!o||e.getTime()<=o.getTime())&&(!a||e.getFullYear()>=a)&&(!r||r>=e.getFullYear())},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),{shortYearCutoff:e,dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,s){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);var n=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(s,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),n,this._getFormatConfig(t))}}),t.fn.datepicker=function(e){if(!this.length)return this;t.datepicker.initialized||(t(document).mousedown(t.datepicker._checkExternalClick),t.datepicker.initialized=!0),0===t("#"+t.datepicker._mainDivId).length&&t("body").append(t.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof e||"isDisabled"!==e&&"getDate"!==e&&"widget"!==e?"option"===e&&2===arguments.length&&"string"==typeof arguments[1]?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof e?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this].concat(i)):t.datepicker._attachDatepicker(this,e)}):t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i))},t.datepicker=new i,t.datepicker.initialized=!1,t.datepicker.uuid=(new Date).getTime(),t.datepicker.version="1.10.3"}(jQuery),function(t){var e={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},i={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0};t.widget("ui.dialog",{version:"1.10.3",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(e){var i=t(this).css(e).offset().top;0>i&&t(this).css("top",e.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&t.fn.draggable&&this._makeDraggable(),this.options.resizable&&t.fn.resizable&&this._makeResizable(),this._isOpen=!1},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var e=this.options.appendTo;return e&&(e.jquery||e.nodeType)?t(e):this.document.find(e||"body").eq(0)},_destroy:function(){var t,e=this.originalPosition;this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),t=e.parent.children().eq(e.index),t.length&&t[0]!==this.element[0]?t.before(this.element):e.parent.append(this.element)},widget:function(){return this.uiDialog},disable:t.noop,enable:t.noop,close:function(e){var i=this;this._isOpen&&this._trigger("beforeClose",e)!==!1&&(this._isOpen=!1,this._destroyOverlay(),this.opener.filter(":focusable").focus().length||t(this.document[0].activeElement).blur(),this._hide(this.uiDialog,this.options.hide,function(){i._trigger("close",e)}))},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,e){var i=!!this.uiDialog.nextAll(":visible").insertBefore(this.uiDialog).length;return i&&!e&&this._trigger("focus",t),i},open:function(){var e=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),undefined):(this._isOpen=!0,this.opener=t(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this._show(this.uiDialog,this.options.show,function(){e._focusTabbable(),e._trigger("focus")}),this._trigger("open"),undefined)},_focusTabbable:function(){var t=this.element.find("[autofocus]");t.length||(t=this.element.find(":tabbable")),t.length||(t=this.uiDialogButtonPane.find(":tabbable")),t.length||(t=this.uiDialogTitlebarClose.filter(":tabbable")),t.length||(t=this.uiDialog),t.eq(0).focus()},_keepFocus:function(e){function i(){var e=this.document[0].activeElement,i=this.uiDialog[0]===e||t.contains(this.uiDialog[0],e);i||this._focusTabbable()}e.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=t("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(e){if(this.options.closeOnEscape&&!e.isDefaultPrevented()&&e.keyCode&&e.keyCode===t.ui.keyCode.ESCAPE)return e.preventDefault(),this.close(e),undefined;if(e.keyCode===t.ui.keyCode.TAB){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");e.target!==n[0]&&e.target!==this.uiDialog[0]||e.shiftKey?e.target!==s[0]&&e.target!==this.uiDialog[0]||!e.shiftKey||(n.focus(1),e.preventDefault()):(s.focus(1),e.preventDefault())}},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var e;this.uiDialogTitlebar=t("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(e){t(e.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=t("<button></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),e=t("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(e),this.uiDialog.attr({"aria-labelledby":e.attr("id")})},_title:function(t){this.options.title||t.html(" "),t.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=t("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=t("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var e=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),t.isEmptyObject(i)||t.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),undefined):(t.each(i,function(i,s){var n,o;s=t.isFunction(s)?{click:s,text:i}:s,s=t.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(e.element[0],arguments)},o={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,t("<button></button>",s).button(o).appendTo(e.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),undefined)},_makeDraggable:function(){function e(t){return{position:t.position,offset:t.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){t(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,e(n))},drag:function(t,s){i._trigger("drag",t,e(s))},stop:function(n,o){s.position=[o.position.left-i.document.scrollLeft(),o.position.top-i.document.scrollTop()],t(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,e(o))}})},_makeResizable:function(){function e(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}</span> <span class='diff-add'>}var i=this,s=this.options,n=s.resizable,o=this.uiDialog.css("position"),a="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:a,start:function(s,n){t(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,e(n))},resize:function(t,s){i._trigger("resize",t,e(s))},stop:function(n,o){s.height=t(this).height(),s.width=t(this).width(),t(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,e(o))}}).css("position",o)},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(s){var n=this,o=!1,a={};t.each(s,function(t,s){n._setOption(t,s),t in e&&(o=!0),t in i&&(a[t]=s)}),o&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",a)},_setOption:function(t,e){var i,s,n=this.uiDialog;"dialogClass"===t&&n.removeClass(this.options.dialogClass).addClass(e),"disabled"!==t&&(this._super(t,e),"appendTo"===t&&this.uiDialog.appendTo(this._appendTo()),"buttons"===t&&this._createButtons(),"closeText"===t&&this.uiDialogTitlebarClose.button({label:""+e}),"draggable"===t&&(i=n.is(":data(ui-draggable)"),i&&!e&&n.draggable("destroy"),!i&&e&&this._makeDraggable()),"position"===t&&this._position(),"resizable"===t&&(s=n.is(":data(ui-resizable)"),s&&!e&&n.resizable("destroy"),s&&"string"==typeof e&&n.resizable("option","handles",e),s||e===!1||this._makeResizable()),"title"===t&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),t=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),e=Math.max(0,s.minHeight-t),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-t):"none","auto"===s.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var e=t(this);return t("<div>").css({position:"absolute",width:e.outerWidth(),height:e.outerHeight()}).appendTo(e.parent()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(e){return t(e.target).closest(".ui-dialog").length?!0:!!t(e.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var e=this,i=this.widgetFullName;t.ui.dialog.overlayInstances||this._delay(function(){t.ui.dialog.overlayInstances&&this.document.bind("focusin.dialog",function(s){e._allowInteraction(s)||(s.preventDefault(),t(".ui-dialog:visible:last .ui-dialog-content").data(i)._focusTabbable())})}),this.overlay=t("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),t.ui.dialog.overlayInstances++}},_destroyOverlay:function(){this.options.modal&&this.overlay&&(t.ui.dialog.overlayInstances--,t.ui.dialog.overlayInstances||this.document.unbind("focusin.dialog"),this.overlay.remove(),this.overlay=null)}}),t.ui.dialog.overlayInstances=0,t.uiBackCompat!==!1&&t.widget("ui.dialog",t.ui.dialog,{_position:function(){var e,i=this.options.position,s=[],n=[0,0];i?(("string"==typeof i||"object"==typeof i&&"0"in i)&&(s=i.split?i.split(" "):[i[0],i[1]],1===s.length&&(s[1]=s[0]),t.each(["left","top"],function(t,e){+s[t]===s[t]&&(n[t]=s[t],s[t]=e)}),i={my:s[0]+(0>n[0]?n[0]:"+"+n[0])+" "+s[1]+(0>n[1]?n[1]:"+"+n[1]),at:s.join(" ")}),i=t.extend({},t.ui.dialog.prototype.options.position,i)):i=t.ui.dialog.prototype.options.position,e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.position(i),e||this.uiDialog.hide()}})}(jQuery),function(t){var e=/up|down|vertical/,i=/up|left|vertical|horizontal/;t.effects.effect.blind=function(s,n){var o,a,r,h=t(this),l=["position","top","bottom","left","right","height","width"],c=t.effects.setMode(h,s.mode||"hide"),u=s.direction||"up",d=e.test(u),p=d?"height":"width",f=d?"top":"left",g=i.test(u),m={},v="show"===c;h.parent().is(".ui-effects-wrapper")?t.effects.save(h.parent(),l):t.effects.save(h,l),h.show(),o=t.effects.createWrapper(h).css({overflow:"hidden"}),a=o[p](),r=parseFloat(o.css(f))||0,m[p]=v?a:0,g||(h.css(d?"bottom":"right",0).css(d?"top":"left","auto").css({position:"absolute"}),m[f]=v?r:a+r),v&&(o.css(p,0),g||o.css(f,r+a)),o.animate(m,{duration:s.duration,easing:s.easing,queue:!1,complete:function(){"hide"===c&&h.hide(),t.effects.restore(h,l),t.effects.removeWrapper(h),n()}})}}(jQuery),function(t){t.effects.effect.bounce=function(e,i){var s,n,o,a=t(this),r=["position","top","bottom","left","right","height","width"],h=t.effects.setMode(a,e.mode||"effect"),l="hide"===h,c="show"===h,u=e.direction||"up",d=e.distance,p=e.times||5,f=2*p+(c||l?1:0),g=e.duration/f,m=e.easing,v="up"===u||"down"===u?"top":"left",_="up"===u||"left"===u,b=a.queue(),y=b.length;for((c||l)&&r.push("opacity"),t.effects.save(a,r),a.show(),t.effects.createWrapper(a),d||(d=a["top"===v?"outerHeight":"outerWidth"]()/3),c&&(o={opacity:1},o[v]=0,a.css("opacity",0).css(v,_?2*-d:2*d).animate(o,g,m)),l&&(d/=Math.pow(2,p-1)),o={},o[v]=0,s=0;p>s;s++)n={},n[v]=(_?"-=":"+=")+d,a.animate(n,g,m).animate(o,g,m),d=l?2*d:d/2;l&&(n={opacity:0},n[v]=(_?"-=":"+=")+d,a.animate(n,g,m)),a.queue(function(){l&&a.hide(),t.effects.restore(a,r),t.effects.removeWrapper(a),i()}),y>1&&b.splice.apply(b,[1,0].concat(b.splice(y,f+1))),a.dequeue()}}(jQuery),function(t){t.effects.effect.clip=function(e,i){var s,n,o,a=t(this),r=["position","top","bottom","left","right","height","width"],h=t.effects.setMode(a,e.mode||"hide"),l="show"===h,c=e.direction||"vertical",u="vertical"===c,d=u?"height":"width",p=u?"top":"left",f={};t.effects.save(a,r),a.show(),s=t.effects.createWrapper(a).css({overflow:"hidden"}),n="IMG"===a[0].tagName?s:a,o=n[d](),l&&(n.css(d,0),n.css(p,o/2)),f[d]=l?o:0,f[p]=l?0:o/2,n.animate(f,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){l||a.hide(),t.effects.restore(a,r),t.effects.removeWrapper(a),i()}})}}(jQuery),function(t){t.effects.effect.drop=function(e,i){var s,n=t(this),o=["position","top","bottom","left","right","opacity","height","width"],a=t.effects.setMode(n,e.mode||"hide"),r="show"===a,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h?"pos":"neg",u={opacity:r?1:0};t.effects.save(n,o),n.show(),t.effects.createWrapper(n),s=e.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===c?-s:s),u[l]=(r?"pos"===c?"+=":"-=":"pos"===c?"-=":"+=")+s,n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){"hide"===a&&n.hide(),t.effects.restore(n,o),t.effects.removeWrapper(n),i()}})}}(jQuery),function(t){t.effects.effect.explode=function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),g||p.hide(),i()}var o,a,r,h,l,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=t.effects.setMode(p,e.mode||"hide"),g="show"===f,m=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/d),_=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(h=m.top+o*_,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*v,l=a-(d-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-a*v,top:-o*_}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:_,left:r+(g?l*v:0),top:h+(g?c*_:0),opacity:g?0:1}).animate({left:r+(g?0:l*v),top:h+(g?0:c*_),opacity:g?1:0},e.duration||500,e.easing,s)}}(jQuery),function(t){t.effects.effect.fade=function(e,i){var s=t(this),n=t.effects.setMode(s,e.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}}(jQuery),function(t){t.effects.effect.fold=function(e,i){var s,n,o=t(this),a=["position","top","bottom","left","right","height","width"],r=t.effects.setMode(o,e.mode||"hide"),h="show"===r,l="hide"===r,c=e.size||15,u=/([0-9]+)%/.exec(c),d=!!e.horizFirst,p=h!==d,f=p?["width","height"]:["height","width"],g=e.duration/2,m={},v={};t.effects.save(o,a),o.show(),s=t.effects.createWrapper(o).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],u&&(c=parseInt(u[1],10)/100*n[l?0:1]),h&&s.css(d?{height:0,width:c}:{height:c,width:0}),m[f[0]]=h?n[0]:c,v[f[1]]=h?n[1]:0,s.animate(m,g,e.easing).animate(v,g,e.easing,function(){l&&o.hide(),t.effects.restore(o,a),t.effects.removeWrapper(o),i()})}}(jQuery),function(t){t.effects.effect.highlight=function(e,i){var s=t(this),n=["backgroundImage","backgroundColor","opacity"],o=t.effects.setMode(s,e.mode||"show"),a={backgroundColor:s.css("backgroundColor")};"hide"===o&&(a.opacity=0),t.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(a,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){"hide"===o&&s.hide(),t.effects.restore(s,n),i()}})}}(jQuery),function(t){t.effects.effect.pulsate=function(e,i){var s,n=t(this),o=t.effects.setMode(n,e.mode||"show"),a="show"===o,r="hide"===o,h=a||"hide"===o,l=2*(e.times||5)+(h?1:0),c=e.duration/l,u=0,d=n.queue(),p=d.length;for((a||!n.is(":visible"))&&(n.css("opacity",0).show(),u=1),s=1;l>s;s++)n.animate({opacity:u},c,e.easing),u=1-u;n.animate({opacity:u},c,e.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&d.splice.apply(d,[1,0].concat(d.splice(p,l+1))),n.dequeue()}}(jQuery),function(t){t.effects.effect.puff=function(e,i){var s=t(this),n=t.effects.setMode(s,e.mode||"hide"),o="hide"===n,a=parseInt(e.percent,10)||150,r=a/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};t.extend(e,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:o?a:100,from:o?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(e)},t.effects.effect.scale=function(e,i){var s=t(this),n=t.extend(!0,{},e),o=t.effects.setMode(s,e.mode||"effect"),a=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"hide"===o?0:100),r=e.direction||"both",h=e.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},c={y:"horizontal"!==r?a/100:1,x:"vertical"!==r?a/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==o&&(n.origin=h||["middle","center"],n.restore=!0),n.from=e.from||("show"===o?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*c.y,width:l.width*c.x,outerHeight:l.outerHeight*c.y,outerWidth:l.outerWidth*c.x},n.fade&&("show"===o&&(n.from.opacity=0,n.to.opacity=1),"hide"===o&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},t.effects.effect.size=function(e,i){var s,n,o,a=t(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],c=["fontSize"],u=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],d=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=t.effects.setMode(a,e.mode||"effect"),f=e.restore||"effect"!==p,g=e.scale||"both",m=e.origin||["middle","center"],v=a.css("position"),_=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&a.show(),s={height:a.height(),width:a.width(),outerHeight:a.outerHeight(),outerWidth:a.outerWidth()},"toggle"===e.mode&&"show"===p?(a.from=e.to||b,a.to=e.from||s):(a.from=e.from||("show"===p?b:s),a.to=e.to||("hide"===p?b:s)),o={from:{y:a.from.height/s.height,x:a.from.width/s.width},to:{y:a.to.height/s.height,x:a.to.width/s.width}},("box"===g||"both"===g)&&(o.from.y!==o.to.y&&(_=_.concat(u),a.from=t.effects.setTransition(a,u,o.from.y,a.from),a.to=t.effects.setTransition(a,u,o.to.y,a.to)),o.from.x!==o.to.x&&(_=_.concat(d),a.from=t.effects.setTransition(a,d,o.from.x,a.from),a.to=t.effects.setTransition(a,d,o.to.x,a.to))),("content"===g||"both"===g)&&o.from.y!==o.to.y&&(_=_.concat(c).concat(l),a.from=t.effects.setTransition(a,c,o.from.y,a.from),a.to=t.effects.setTransition(a,c,o.to.y,a.to)),t.effects.save(a,_),a.show(),t.effects.createWrapper(a),a.css("overflow","hidden").css(a.from),m&&(n=t.effects.getBaseline(m,s),a.from.top=(s.outerHeight-a.outerHeight())*n.y,a.from.left=(s.outerWidth-a.outerWidth())*n.x,a.to.top=(s.outerHeight-a.to.outerHeight)*n.y,a.to.left=(s.outerWidth-a.to.outerWidth)*n.x),a.css(a.from),("content"===g||"both"===g)&&(u=u.concat(["marginTop","marginBottom"]).concat(c),d=d.concat(["marginLeft","marginRight"]),l=r.concat(u).concat(d),a.find("*[width]").each(function(){var i=t(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};f&&t.effects.save(i,l),i.from={height:s.height*o.from.y,width:s.width*o.from.x,outerHeight:s.outerHeight*o.from.y,outerWidth:s.outerWidth*o.from.x},i.to={height:s.height*o.to.y,width:s.width*o.to.x,outerHeight:s.height*o.to.y,outerWidth:s.width*o.to.x},o.from.y!==o.to.y&&(i.from=t.effects.setTransition(i,u,o.from.y,i.from),i.to=t.effects.setTransition(i,u,o.to.y,i.to)),o.from.x!==o.to.x&&(i.from=t.effects.setTransition(i,d,o.from.x,i.from),i.to=t.effects.setTransition(i,d,o.to.x,i.to)),i.css(i.from),i.animate(i.to,e.duration,e.easing,function(){f&&t.effects.restore(i,l)})})),a.animate(a.to,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){0===a.to.opacity&&a.css("opacity",a.from.opacity),"hide"===p&&a.hide(),t.effects.restore(a,_),f||("static"===v?a.css({position:"relative",top:a.to.top,left:a.to.left}):t.each(["top","left"],function(t,e){a.css(e,function(e,i){var s=parseInt(i,10),n=t?a.to.left:a.to.top;return"auto"===i?n+"px":s+n+"px"})})),t.effects.removeWrapper(a),i()}})}}(jQuery),function(t){t.effects.effect.shake=function(e,i){var s,n=t(this),o=["position","top","bottom","left","right","height","width"],a=t.effects.setMode(n,e.mode||"effect"),r=e.direction||"left",h=e.distance||20,l=e.times||3,c=2*l+1,u=Math.round(e.duration/c),d="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},g={},m={},v=n.queue(),_=v.length;for(t.effects.save(n,o),n.show(),t.effects.createWrapper(n),f[d]=(p?"-=":"+=")+h,g[d]=(p?"+=":"-=")+2*h,m[d]=(p?"-=":"+=")+2*h,n.animate(f,u,e.easing),s=1;l>s;s++)n.animate(g,u,e.easing).animate(m,u,e.easing);n.animate(g,u,e.easing).animate(f,u/2,e.easing).queue(function(){"hide"===a&&n.hide(),t.effects.restore(n,o),t.effects.removeWrapper(n),i()}),_>1&&v.splice.apply(v,[1,0].concat(v.splice(_,c+1))),n.dequeue()}}(jQuery),function(t){t.effects.effect.slide=function(e,i){var s,n=t(this),o=["position","top","bottom","left","right","width","height"],a=t.effects.setMode(n,e.mode||"show"),r="show"===a,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h,u={};t.effects.save(n,o),n.show(),s=e.distance||n["top"===l?"outerHeight":"outerWidth"](!0),t.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,c?isNaN(s)?"-"+s:-s:s),u[l]=(r?c?"+=":"-=":c?"-=":"+=")+s,n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){"hide"===a&&n.hide(),t.effects.restore(n,o),t.effects.removeWrapper(n),i()}})}}(jQuery),function(t){t.effects.effect.transfer=function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,h=o?a.scrollLeft():0,l=n.offset(),c={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(e.className).css({top:u.top-r,left:u.left-h,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),i()})}}(jQuery),function(t){t.widget("ui.menu",{version:"1.10.3",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content ui-corner-all").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}).bind("click"+this.eventNamespace,t.proxy(function(t){this.options.disabled&&t.preventDefault()},this)),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item > a":function(t){t.preventDefault()},"click .ui-state-disabled > a":function(t){t.preventDefault()},"click .ui-menu-item:has(a)":function(e){var i=t(e.target).closest(".ui-menu-item");!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.mouseHandled=!0,this.select(e),i.has(".ui-menu").length?this.expand(e):this.element.is(":focus")||(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){var i=t(e.currentTarget);i.siblings().children(".ui-state-active").removeClass("ui-state-active"),this.focus(e,i)},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.children(".ui-menu-item").eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){t.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){t(e.target).closest(".ui-menu").length||this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").children("a").removeUniqueId().removeClass("ui-corner-all ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var e=t(this);e.data("ui-menu-submenu-carat")&&e.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(e){function i(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var s,n,o,a,r,h=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:h=!1,n=this.previousFilter||"",o=String.fromCharCode(e.keyCode),a=!1,clearTimeout(this.filterTimer),o===n?a=!0:o=n+o,r=RegExp("^"+i(o),"i"),s=this.activeMenu.children(".ui-menu-item").filter(function(){return r.test(t(this).children("a").text())}),s=a&&-1!==s.index(this.active.next())?this.active.nextAll(".ui-menu-item"):s,s.length||(o=String.fromCharCode(e.keyCode),r=RegExp("^"+i(o),"i"),s=this.activeMenu.children(".ui-menu-item").filter(function(){return r.test(t(this).children("a").text())})),s.length?(this.focus(e,s),s.length>1?(this.previousFilter=o,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter):delete this.previousFilter}h&&e.preventDefault()},_activate:function(t){this.active.is(".ui-state-disabled")||(this.active.children("a[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i=this.options.icons.submenu,s=this.element.find(this.options.menus);s.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-corner-all").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),s=e.prev("a"),n=t("<span>").addClass("ui-menu-icon ui-icon "+i).data("ui-menu-submenu-carat",!0);s.attr("aria-haspopup","true").prepend(n),e.attr("aria-labelledby",s.attr("id"))}),e=s.add(this.element),e.children(":not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","presentation").children("a").uniqueId().addClass("ui-corner-all").attr({tabIndex:-1,role:this._itemRole()}),e.children(":not(.ui-menu-item)").each(function(){var e=t(this);/[^\-\u2014\u2013\s]/.test(e.text())||e.addClass("ui-widget-content ui-menu-divider")}),e.children(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){"icons"===t&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(e.submenu),this._super(t,e)},focus:function(t,e){var i,s;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children("a").addClass("ui-state-focus"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").children("a:first").addClass("ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.height(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this.active.children("a").removeClass("ui-state-focus"),this.active=null,this._trigger("blur",t,{item:this.active}))},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find("a.ui-state-active").removeClass("ui-state-active")},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").children(".ui-menu-item").first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.children(".ui-menu-item")[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.children(".ui-menu-item")[this.active?"last":"first"]())),undefined):(this.next(e),undefined)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.children(".ui-menu-item").first())),undefined):(this.next(e),undefined)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(e){this.active=this.active||t(e.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(e,!0),this._trigger("select",e,i)}})}(jQuery),function(t,e){function i(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function s(e,i){return parseInt(t.css(e,i),10)||0}function n(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}t.ui=t.ui||{};var o,a=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,c=/top|center|bottom/,u=/[\+\-]\d+(\.[\d]+)?%?/,d=/^\w+/,p=/%$/,f=t.fn.position;t.position={scrollbarWidth:function(){if(o!==e)return o;var i,s,n=t("<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=n.children()[0];return t("body").append(n),i=a.offsetWidth,n.css("overflow","scroll"),s=a.offsetWidth,i===s&&(s=n[0].clientWidth),n.remove(),o=i-s},getScrollInfo:function(e){var i=e.isWindow?"":e.element.css("overflow-x"),s=e.isWindow?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]);return{element:i,isWindow:s,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s?i.width():i.outerWidth(),height:s?i.height():i.outerHeight()}}},t.fn.position=function(e){if(!e||!e.of)return f.apply(this,arguments);e=t.extend({},e);var o,p,g,m,v,_,b=t(e.of),y=t.position.getWithinInfo(e.within),w=t.position.getScrollInfo(y),k=(e.collision||"flip").split(" "),x={};return _=n(b),b[0].preventDefault&&(e.at="left top"),p=_.width,g=_.height,m=_.offset,v=t.extend({},m),t.each(["my","at"],function(){var t,i,s=(e[this]||"").split(" ");1===s.length&&(s=l.test(s[0])?s.concat(["center"]):c.test(s[0])?["center"].concat(s):["center","center"]),s[0]=l.test(s[0])?s[0]:"center",s[1]=c.test(s[1])?s[1]:"center",t=u.exec(s[0]),i=u.exec(s[1]),x[this]=[t?t[0]:0,i?i[0]:0],e[this]=[d.exec(s[0])[0],d.exec(s[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===e.at[0]?v.left+=p:"center"===e.at[0]&&(v.left+=p/2),"bottom"===e.at[1]?v.top+=g:"center"===e.at[1]&&(v.top+=g/2),o=i(x.at,p,g),v.left+=o[0],v.top+=o[1],this.each(function(){var n,l,c=t(this),u=c.outerWidth(),d=c.outerHeight(),f=s(this,"marginLeft"),_=s(this,"marginTop"),D=u+f+s(this,"marginRight")+w.width,C=d+_+s(this,"marginBottom")+w.height,I=t.extend({},v),P=i(x.my,c.outerWidth(),c.outerHeight());"right"===e.my[0]?I.left-=u:"center"===e.my[0]&&(I.left-=u/2),"bottom"===e.my[1]?I.top-=d:"center"===e.my[1]&&(I.top-=d/2),I.left+=P[0],I.top+=P[1],t.support.offsetFractions||(I.left=h(I.left),I.top=h(I.top)),n={marginLeft:f,marginTop:_},t.each(["left","top"],function(i,s){t.ui.position[k[i]]&&t.ui.position[k[i]][s](I,{targetWidth:p,targetHeight:g,elemWidth:u,elemHeight:d,collisionPosition:n,collisionWidth:D,collisionHeight:C,offset:[o[0]+P[0],o[1]+P[1]],my:e.my,at:e.at,within:y,elem:c})}),e.using&&(l=function(t){var i=m.left-I.left,s=i+p-u,n=m.top-I.top,o=n+g-d,h={target:{element:b,left:m.left,top:m.top,width:p,height:g},element:{element:c,left:I.left,top:I.top,width:u,height:d},horizontal:0>s?"left":i>0?"right":"center",vertical:0>o?"top":n>0?"bottom":"middle"};u>p&&p>r(i+s)&&(h.horizontal="center"),d>g&&g>r(n+o)&&(h.vertical="middle"),h.important=a(r(i),r(s))>a(r(n),r(o))?"horizontal":"vertical",e.using.call(this,t,h)}),c.offset(t.extend(I,{using:l}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,o=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-o-n;e.collisionWidth>o?h>0&&0>=l?(i=t.left+h+e.collisionWidth-o-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+o-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=a(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,o=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-o-n;e.collisionHeight>o?h>0&&0>=l?(i=t.top+h+e.collisionHeight-o-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+o-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=a(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,a=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-a-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-a-o,(0>i||r(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>r(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,a=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-a-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-a-o,t.top+p+f+g>c&&(0>s||r(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-h,t.top+p+f+g>u&&(i>0||u>r(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}},function(){var e,i,s,n,o,a=document.getElementsByTagName("body")[0],r=document.createElement("div");e=document.createElement(a?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},a&&t.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)e.style[o]=s[o];e.appendChild(r),i=a||document.documentElement,i.insertBefore(e,i.firstChild),r.style.cssText="position: absolute; left: 10.7432222px;",n=t(r).offset().left,t.support.offsetFractions=n>10&&11>n,e.innerHTML="",i.removeChild(e)}()}(jQuery),function(t,e){t.widget("ui.progressbar",{version:"1.10.3",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=t("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()</span> <span class='diff-add'>},value:function(t){return t===e?this.options.value:(this.options.value=this._constrainedValue(t),this._refreshValue(),e)},_constrainedValue:function(t){return t===e&&(t=this.options.value),this.indeterminate=t===!1,"number"!=typeof t&&(t=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){"max"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var e=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||e>this.min).toggleClass("ui-corner-right",e===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=t("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":e}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==e&&(this.oldValue=e,this._trigger("change")),e===this.options.max&&this._trigger("complete")}})}(jQuery),function(t){var e=5;t.widget("ui.slider",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var e,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),o="<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",a=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),e=n.length;i>e;e++)a.push(o);this.handles=n.add(t(a.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(e){t(this).data("ui-slider-handle-index",e)})},_createRange:function(){var e=this.options,i="";e.range?(e.range===!0&&(e.values?e.values.length&&2!==e.values.length?e.values=[e.values[0],e.values[0]]:t.isArray(e.values)&&(e.values=e.values.slice(0)):e.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=t("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===e.range||"max"===e.range?" ui-slider-range-"+e.range:""))):this.range=t([])},_setupEvents:function(){var t=this.handles.add(this.range).filter("a");this._off(t),this._on(t,this._handleEvents),this._hoverable(t),this._focusable(t)},_destroy:function(){this.handles.remove(),this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(e){var i,s,n,o,a,r,h,l,c=this,u=this.options;return u.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:e.pageX,y:e.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(e){var i=Math.abs(s-c.values(e));(n>i||n===i&&(e===c._lastChangedValue||c.values(e)===u.min))&&(n=i,o=t(this),a=e)}),r=this._start(e,a),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=a,o.addClass("ui-state-active").focus(),h=o.offset(),l=!t(e.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:e.pageX-h.left-o.width()/2,top:e.pageY-h.top-o.height()/2-(parseInt(o.css("borderTopWidth"),10)||0)-(parseInt(o.css("borderBottomWidth"),10)||0)+(parseInt(o.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(e,a,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(t){var e={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(e);return this._slide(t,this._handleIndex,i),!1},_mouseStop:function(t){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(t,this._handleIndex),this._change(t,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(t){var e,i,s,n,o;return"horizontal"===this.orientation?(e=this.elementSize.width,i=t.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(e=this.elementSize.height,i=t.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/e,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),o=this._valueMin()+s*n,this._trimAlignValue(o)},_start:function(t,e){var i={handle:this.handles[e],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(e),i.values=this.values()),this._trigger("start",t,i)},_slide:function(t,e,i){var s,n,o;this.options.values&&this.options.values.length?(s=this.values(e?0:1),2===this.options.values.length&&this.options.range===!0&&(0===e&&i>s||1===e&&s>i)&&(i=s),i!==this.values(e)&&(n=this.values(),n[e]=i,o=this._trigger("slide",t,{handle:this.handles[e],value:i,values:n}),s=this.values(e?0:1),o!==!1&&this.values(e,i,!0))):i!==this.value()&&(o=this._trigger("slide",t,{handle:this.handles[e],value:i}),o!==!1&&this.value(i))},_stop:function(t,e){var i={handle:this.handles[e],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(e),i.values=this.values()),this._trigger("stop",t,i)},_change:function(t,e){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[e],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(e),i.values=this.values()),this._lastChangedValue=e,this._trigger("change",t,i)}},value:function(t){return arguments.length?(this.options.value=this._trimAlignValue(t),this._refreshValue(),this._change(null,0),undefined):this._value()},values:function(e,i){var s,n,o;if(arguments.length>1)return this.options.values[e]=this._trimAlignValue(i),this._refreshValue(),this._change(null,e),undefined;if(!arguments.length)return this._values();if(!t.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(e):this.value();for(s=this.options.values,n=arguments[0],o=0;s.length>o;o+=1)s[o]=this._trimAlignValue(n[o]),this._change(null,o);this._refreshValue()},_setOption:function(e,i){var s,n=0;switch("range"===e&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),t.isArray(this.options.values)&&(n=this.options.values.length),t.Widget.prototype._setOption.apply(this,arguments),e){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue();break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"min":case"max":this._animateOff=!0,this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var t=this.options.value;return t=this._trimAlignValue(t)},_values:function(t){var e,i,s;if(arguments.length)return e=this.options.values[t],e=this._trimAlignValue(e);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(t){if(this._valueMin()>=t)return this._valueMin();if(t>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,i=(t-this._valueMin())%e,s=t-i;return 2*Math.abs(i)>=e&&(s+=i>0?e:-e),parseFloat(s.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var e,i,s,n,o,a=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,c={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),c["horizontal"===h.orientation?"left":"bottom"]=i+"%",t(this).stop(1,1)[l?"animate":"css"](c,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:r.animate}))),e=i}):(s=this.value(),n=this._valueMin(),o=this._valueMax(),i=o!==n?100*((s-n)/(o-n)):0,c["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](c,r.animate),"min"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===a&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===a&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(i){var s,n,o,a,r=t(i.target).data("ui-slider-handle-index");switch(i.keyCode){case t.ui.keyCode.HOME:case t.ui.keyCode.END:case t.ui.keyCode.PAGE_UP:case t.ui.keyCode.PAGE_DOWN:case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(i.preventDefault(),!this._keySliding&&(this._keySliding=!0,t(i.target).addClass("ui-state-active"),s=this._start(i,r),s===!1))return}switch(a=this.options.step,n=o=this.options.values&&this.options.values.length?this.values(r):this.value(),i.keyCode){case t.ui.keyCode.HOME:o=this._valueMin();break;case t.ui.keyCode.END:o=this._valueMax();break;case t.ui.keyCode.PAGE_UP:o=this._trimAlignValue(n+(this._valueMax()-this._valueMin())/e);break;case t.ui.keyCode.PAGE_DOWN:o=this._trimAlignValue(n-(this._valueMax()-this._valueMin())/e);break;case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:if(n===this._valueMax())return;o=this._trimAlignValue(n+a);break;case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(n===this._valueMin())return;o=this._trimAlignValue(n-a)}this._slide(i,r,o)},click:function(t){t.preventDefault()},keyup:function(e){var i=t(e.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(e,i),this._change(e,i),t(e.target).removeClass("ui-state-active"))}}})}(jQuery),function(t){function e(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.widget("ui.spinner",{version:"1.10.3",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var e={},i=this.element;return t.each(["min","max","step"],function(t,s){var n=i.attr(s);void 0!==n&&n.length&&(e[s]=n)}),e},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",t),void 0)},mousewheel:function(t,e){if(e){if(!this.spinning&&!this._start(t))return!1;this._spin((e>0?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},"mousedown .ui-spinner-button":function(e){function i(){var t=this.element[0]===this.document[0].activeElement;t||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),e.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(e)!==!1&&this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(e){return t(e.currentTarget).hasClass("ui-state-active")?this._start(e)===!1?!1:(this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var t=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=t.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*t.height())&&t.height()>0&&t.height(t.height()),this.options.disabled&&this.disable()},_keydown:function(e){var i=this.options,s=t.ui.keyCode;switch(e.keyCode){case s.UP:return this._repeat(null,1,e),!0;case s.DOWN:return this._repeat(null,-1,e),!0;case s.PAGE_UP:return this._repeat(null,i.page,e),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,e),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>▲</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>▼</span>"+"</a>"},_start:function(t){return this.spinning||this._trigger("start",t)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&this._trigger("spin",e,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(e){var i=this.options.incremental;return i?t.isFunction(i)?i(e):Math.floor(e*e*e/5e4-e*e/500+17*e/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_adjustValue:function(t){var e,i,s=this.options;return e=null!==s.min?s.min:0,i=t-e,i=Math.round(i/s.step)*s.step,t=e+i,t=parseFloat(t.toFixed(this._precision())),null!==s.max&&t>s.max?s.max:null!==s.min&&s.min>t?s.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",t))},_setOption:function(t,e){if("culture"===t||"numberFormat"===t){var i=this._parse(this.element.val());return this.options[t]=e,this.element.val(this._format(i)),void 0}("max"===t||"min"===t||"step"===t)&&"string"==typeof e&&(e=this._parse(e)),"icons"===t&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(e.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(e.down)),this._super(t,e),"disabled"===t&&(e?(this.element.prop("disabled",!0),this.buttons.button("disable")):(this.element.prop("disabled",!1),this.buttons.button("enable")))},_setOptions:e(function(t){this._super(t),this._value(this.element.val())}),_parse:function(t){return"string"==typeof t&&""!==t&&(t=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t),""===t||isNaN(t)?null:t},_format:function(t){return""===t?"":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},_value:function(t,e){var i;""!==t&&(i=this._parse(t),null!==i&&(e||(i=this._adjustValue(i)),t=this._format(i))),this.element.val(t),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:e(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:e(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:e(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:e(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){return arguments.length?(e(this._value).call(this,t),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}})}(jQuery),function(t,e){function i(){return++n}function s(t){return t.hash.length>1&&decodeURIComponent(t.href.replace(o,""))===decodeURIComponent(location.href.replace(o,""))}var n=0,o=/#.*$/;t.widget("ui.tabs",{version:"1.10.3",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_create:function(){var e=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible).delegate(".ui-tabs-nav > li","mousedown"+this.eventNamespace,function(e){t(this).is(".ui-state-disabled")&&e.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){t(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this._processTabs(),i.active=this._initialActive(),t.isArray(i.disabled)&&(i.disabled=t.unique(i.disabled.concat(t.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):t(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var i=this.options.active,s=this.options.collapsible,n=location.hash.substring(1);return null===i&&(n&&this.tabs.each(function(s,o){return t(o).attr("aria-controls")===n?(i=s,!1):e}),null===i&&(i=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===i||-1===i)&&(i=this.tabs.length?0:!1)),i!==!1&&(i=this.tabs.index(this.tabs.eq(i)),-1===i&&(i=s?!1:0)),!s&&i===!1&&this.anchors.length&&(i=0),i},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(i){var s=t(this.document[0].activeElement).closest("li"),n=this.tabs.index(s),o=!0;if(!this._handlePageNav(i)){switch(i.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:n++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:o=!1,n--;break;case t.ui.keyCode.END:n=this.anchors.length-1;break;case t.ui.keyCode.HOME:n=0;break;case t.ui.keyCode.SPACE:return i.preventDefault(),clearTimeout(this.activating),this._activate(n),e;case t.ui.keyCode.ENTER:return i.preventDefault(),clearTimeout(this.activating),this._activate(n===this.options.active?!1:n),e;default:return}i.preventDefault(),clearTimeout(this.activating),n=this._focusNextTab(n,o),i.ctrlKey||(s.attr("aria-selected","false"),this.tabs.eq(n).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",n)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.focus())},_handlePageNav:function(i){return i.altKey&&i.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):i.altKey&&i.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):e},_findNextTab:function(e,i){function s(){return e>n&&(e=0),0>e&&(e=n),e}for(var n=this.tabs.length-1;-1!==t.inArray(s(),this.options.disabled);)e=i?e+1:e-1;return e},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).focus(),t},_setOption:function(t,i){return"active"===t?(this._activate(i),e):"disabled"===t?(this._setupDisabled(i),e):(this._super(t,i),"collapsible"===t&&(this.element.toggleClass("ui-tabs-collapsible",i),i||this.options.active!==!1||this._activate(0)),"event"===t&&this._setupEvents(i),"heightStyle"===t&&this._setupHeightStyle(i),e)},_tabId:function(t){return t.attr("aria-controls")||"ui-tabs-"+i()},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var e=this.options,i=this.tablist.children(":has(a[href])");e.disabled=t.map(i.filter(".ui-state-disabled"),function(t){return i.index(t)}),this._processTabs(),e.active!==!1&&this.anchors.length?this.active.length&&!t.contains(this.tablist[0],this.active[0])?this.tabs.length===e.disabled.length?(e.active=!1,this.active=t()):this._activate(this._findNextTab(Math.max(0,e.active-1),!1)):e.active=this.tabs.index(this.active):(e.active=!1,this.active=t()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-expanded":"false","aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-expanded":"true","aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var e=this;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist"),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return t("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=t(),this.anchors.each(function(i,n){var o,a,r,h=t(n).uniqueId().attr("id"),l=t(n).closest("li"),c=l.attr("aria-controls");s(n)?(o=n.hash,a=e.element.find(e._sanitizeSelector(o))):(r=e._tabId(l),o="#"+r,a=e.element.find(o),a.length||(a=e._createPanel(r),a.insertAfter(e.panels[i-1]||e.tablist)),a.attr("aria-live","polite")),a.length&&(e.panels=e.panels.add(a)),c&&l.data("ui-tabs-aria-controls",c),l.attr({"aria-controls":o.substring(1),"aria-labelledby":h}),a.attr("aria-labelledby",h)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel")},_getList:function(){return this.element.find("ol,ul").eq(0)},_createPanel:function(e){return t("<div>").attr("id",e).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(e){t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1);for(var i,s=0;i=this.tabs[s];s++)e===!0||-1!==t.inArray(s,e)?t(i).addClass("ui-state-disabled").attr("aria-disabled","true"):t(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=e},_setupEvents:function(e){var i={click:function(t){t.preventDefault()}};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(e){var i,s=this.element.parent();"fill"===e?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=t(this).outerHeight(!0)}),this.panels.each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.panels.each(function(){i=Math.max(i,t(this).height("").height())}).height(i))},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n.closest("li"),a=o[0]===s[0],r=a&&i.collapsible,h=r?t():this._getPanelForTab(o),l=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:l,newTab:r?t():o,newPanel:h};e.preventDefault(),o.hasClass("ui-state-disabled")||o.hasClass("ui-tabs-loading")||this.running||a&&!i.collapsible||this._trigger("beforeActivate",e,c)===!1||(i.active=r?!1:this.tabs.index(o),this.active=a?t():o,this.xhr&&this.xhr.abort(),l.length||h.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(o),e),this._toggle(e,c))},_toggle:function(e,i){function s(){o.running=!1,o._trigger("activate",e,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),a.length&&o.options.show?o._show(a,o.options.show,s):(a.show(),s())}var o=this,a=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr({"aria-expanded":"false","aria-hidden":"true"}),i.oldTab.attr("aria-selected","false"),a.length&&r.length?i.oldTab.attr("tabIndex",-1):a.length&&this.tabs.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),a.attr({"aria-expanded":"true","aria-hidden":"false"}),i.newTab.attr({"aria-selected":"true",tabIndex:0})},_activate:function(e){var i,s=this._findActive(e);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return e===!1?t():this.tabs.eq(e)},_getIndex:function(t){return"string"==typeof t&&(t=this.anchors.index(this.anchors.filter("[href$='"+t+"']"))),t},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,"ui-tabs-destroy")?t(this).remove():t(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var e=t(this),i=e.data("ui-tabs-aria-controls");i?e.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):e.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(i){var s=this.options.disabled;s!==!1&&(i===e?s=!1:(i=this._getIndex(i),s=t.isArray(s)?t.map(s,function(t){return t!==i?t:null}):t.map(this.tabs,function(t,e){return e!==i?e:null})),this._setupDisabled(s))},disable:function(i){var s=this.options.disabled;if(s!==!0){if(i===e)s=!0;else{if(i=this._getIndex(i),-1!==t.inArray(i,s))return;s=t.isArray(s)?t.merge([i],s).sort():[i]}this._setupDisabled(s)}},load:function(e,i){e=this._getIndex(e);var n=this,o=this.tabs.eq(e),a=o.find(".ui-tabs-anchor"),r=this._getPanelForTab(o),h={tab:o,panel:r};s(a[0])||(this.xhr=t.ajax(this._ajaxSettings(a,i,h)),this.xhr&&"canceled"!==this.xhr.statusText&&(o.addClass("ui-tabs-loading"),r.attr("aria-busy","true"),this.xhr.success(function(t){setTimeout(function(){r.html(t),n._trigger("load",i,h)},1)}).complete(function(t,e){setTimeout(function(){"abort"===e&&n.panels.stop(!1,!0),o.removeClass("ui-tabs-loading"),r.removeAttr("aria-busy"),t===n.xhr&&delete n.xhr},1)})))},_ajaxSettings:function(e,i,s){var n=this;return{url:e.attr("href"),beforeSend:function(e,o){return n._trigger("beforeLoad",i,t.extend({jqXHR:e,ajaxSettings:o},s))}}},_getPanelForTab:function(e){var i=t(e).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}})}(jQuery),function(t){function e(e,i){var s=(e.attr("aria-describedby")||"").split(/\s+/);s.push(i),e.data("ui-tooltip-id",i).attr("aria-describedby",t.trim(s.join(" ")))}function i(e){var i=e.data("ui-tooltip-id"),s=(e.attr("aria-describedby")||"").split(/\s+/),n=t.inArray(i,s);-1!==n&&s.splice(n,1),e.removeData("ui-tooltip-id"),s=t.trim(s.join(" ")),s?e.attr("aria-describedby",s):e.removeAttr("aria-describedby")}var s=0;t.widget("ui.tooltip",{version:"1.10.3",options:{content:function(){var e=t(this).attr("title")||"";return t("<a>").text(e).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable()},_setOption:function(e,i){var s=this;return"disabled"===e?(this[i?"_disable":"_enable"](),this.options[e]=i,void 0):(this._super(e,i),"content"===e&&t.each(this.tooltips,function(t,e){s._updateContent(e)}),void 0)},_disable:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur");n.target=n.currentTarget=s[0],e.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var e=t(this);e.is("[title]")&&e.data("ui-tooltip-title",e.attr("title")).attr("title","")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var e=t(this);e.data("ui-tooltip-title")&&e.attr("title",e.data("ui-tooltip-title"))})},open:function(e){var i=this,s=t(e?e.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),e&&"mouseover"===e.type&&s.parents().each(function(){var e,s=t(this);s.data("ui-tooltip-open")&&(e=t.Event("blur"),e.target=e.currentTarget=this,i.close(e,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._updateContent(s,e))},_updateContent:function(t,e){var i,s=this.options.content,n=this,o=e?e.type:null;return"string"==typeof s?this._open(e,t,s):(i=s.call(t[0],function(i){t.data("ui-tooltip-open")&&n._delay(function(){e&&(e.type=o),this._open(e,t,i)})}),i&&this._open(e,t,i),void 0)},_open:function(i,s,n){function o(t){l.of=t,a.is(":hidden")||a.position(l)}var a,r,h,l=t.extend({},this.options.position);</span> <span class='diff-add'>if(n){if(a=this._find(s),a.length)return a.find(".ui-tooltip-content").html(n),void 0;s.is("[title]")&&(i&&"mouseover"===i.type?s.attr("title",""):s.removeAttr("title")),a=this._tooltip(s),e(s,a.attr("id")),a.find(".ui-tooltip-content").html(n),this.options.track&&i&&/^mouse/.test(i.type)?(this._on(this.document,{mousemove:o}),o(i)):a.position(t.extend({of:s},this.options.position)),a.hide(),this._show(a,this.options.show),this.options.show&&this.options.show.delay&&(h=this.delayedShow=setInterval(function(){a.is(":visible")&&(o(l.of),clearInterval(h))},t.fx.interval)),this._trigger("open",i,{tooltip:a}),r={keyup:function(e){if(e.keyCode===t.ui.keyCode.ESCAPE){var i=t.Event(e);i.currentTarget=s[0],this.close(i,!0)}},remove:function(){this._removeTooltip(a)}},i&&"mouseover"!==i.type||(r.mouseleave="close"),i&&"focusin"!==i.type||(r.focusout="close"),this._on(!0,s,r)}},close:function(e){var s=this,n=t(e?e.currentTarget:this.element),o=this._find(n);this.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&n.attr("title",n.data("ui-tooltip-title")),i(n),o.stop(!0),this._hide(o,this.options.hide,function(){s._removeTooltip(t(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),e&&"mouseleave"===e.type&&t.each(this.parents,function(e,i){t(i.element).attr("title",i.title),delete s.parents[e]}),this.closing=!0,this._trigger("close",e,{tooltip:o}),this.closing=!1)},_tooltip:function(e){var i="ui-tooltip-"+s++,n=t("<div>").attr({id:i,role:"tooltip"}).addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||""));return t("<div>").addClass("ui-tooltip-content").appendTo(n),n.appendTo(this.document[0].body),this.tooltips[i]=e,n},_find:function(e){var i=e.data("ui-tooltip-id");return i?t("#"+i):t()},_removeTooltip:function(t){t.remove(),delete this.tooltips[t.attr("id")]},_destroy:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur");n.target=n.currentTarget=s[0],e.close(n,!0),t("#"+i).remove(),s.data("ui-tooltip-title")&&(s.attr("title",s.data("ui-tooltip-title")),s.removeData("ui-tooltip-title"))})}})}(jQuery);</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/jquery.min.js b/ipynb/Array-feature-overlap-05_files/jquery.min.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..9a85bd3</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/jquery.min.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>/*! jQuery v2.0.3 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license</span> <span class='diff-add'>//@ sourceMappingURL=jquery.min.map</span> <span class='diff-add'>*/</span> <span class='diff-add'>(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],p="2.0.3",f=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("DOMContentLoaded",S,!1),e.removeEventListener("load",S,!1),x.ready()};x.fn=x.prototype={jquery:p,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if("string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[1]||{},a=2),"object"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger("ready").off("ready")))},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if("object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=undefined}return(!t||t.getElementsByTagName("parsererror").length)&&x.error("Invalid XML: "+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf("use strict")?(t=o.createElement("script"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,"ms-").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?"":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if("number"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return f.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),"complete"===o.readyState?setTimeout(x.ready):(o.addEventListener("DOMContentLoaded",S,!1),e.addEventListener("load",S,!1))),n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,p,f,h,d,g,m,y,v="sizzle"+-new Date,b=e.document,w=0,T=0,C=st(),k=st(),N=st(),E=!1,S=function(e,t){return e===t?(E=!0,0):0},j=typeof undefined,D=1<<31,A={}.hasOwnProperty,L=[],q=L.pop,H=L.push,O=L.push,F=L.slice,P=L.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",W="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",$=W.replace("w","w#"),B="\\["+M+"*("+W+")"+M+"*(?:([*^$|!~]?=)"+M+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+$+")|)|)"+M+"*\\]",I=":("+W+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+B.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=RegExp("^"+M+"*,"+M+"*"),X=RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=RegExp(M+"*[+~]"),Y=RegExp("="+M+"*([^\\]'\"]*)"+M+"*\\]","g"),V=RegExp(I),G=RegExp("^"+$+"$"),J={ID:RegExp("^#("+W+")"),CLASS:RegExp("^\\.("+W+")"),TAG:RegExp("^("+W.replace("w","w*")+")"),ATTR:RegExp("^"+B),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:RegExp("^(?:"+R+")$","i"),needsContext:RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Q=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Z=/^(?:input|select|textarea|button)$/i,et=/^h\d$/i,tt=/'|\\/g,nt=RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),rt=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{O.apply(L=F.call(b.childNodes),b.childNodes),L[b.childNodes.length].nodeType}catch(it){O={apply:L.length?function(e,t){H.apply(e,F.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function ot(e,t,r,i){var o,s,a,u,l,f,g,m,x,w;if((t?t.ownerDocument||t:b)!==p&&c(t),t=t||p,r=r||[],!e||"string"!=typeof e)return r;if(1!==(u=t.nodeType)&&9!==u)return[];if(h&&!i){if(o=K.exec(e))if(a=o[1]){if(9===u){if(s=t.getElementById(a),!s||!s.parentNode)return r;if(s.id===a)return r.push(s),r}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(a))&&y(t,s)&&s.id===a)return r.push(s),r}else{if(o[2])return O.apply(r,t.getElementsByTagName(e)),r;if((a=o[3])&&n.getElementsByClassName&&t.getElementsByClassName)return O.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&(!d||!d.test(e))){if(m=g=v,x=t,w=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){f=gt(e),(g=t.getAttribute("id"))?m=g.replace(tt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",l=f.length;while(l--)f[l]=m+mt(f[l]);x=U.test(e)&&t.parentNode||t,w=f.join(",")}if(w)try{return O.apply(r,x.querySelectorAll(w)),r}catch(T){}finally{g||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,r,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>i.cacheLength&&delete t[e.shift()],t[n]=r}return t}function at(e){return e[v]=!0,e}function ut(e){var t=p.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function lt(e,t){var n=e.split("|"),r=e.length;while(r--)i.attrHandle[n[r]]=t}function ct(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return at(function(t){return t=+t,at(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}s=ot.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},n=ot.support={},c=ot.setDocument=function(e){var t=e?e.ownerDocument||e:b,r=t.defaultView;return t!==p&&9===t.nodeType&&t.documentElement?(p=t,f=t.documentElement,h=!s(t),r&&r.attachEvent&&r!==r.top&&r.attachEvent("onbeforeunload",function(){c()}),n.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ut(function(e){return e.appendChild(t.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),n.getById=ut(function(e){return f.appendChild(e).id=v,!t.getElementsByName||!t.getElementsByName(v).length}),n.getById?(i.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){return e.getAttribute("id")===t}}):(delete i.find.ID,i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=n.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&h?t.getElementsByClassName(e):undefined},g=[],d=[],(n.qsa=Q.test(t.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll(":checked").length||d.push(":checked")}),ut(function(e){var n=t.createElement("input");n.setAttribute("type","hidden"),e.appendChild(n).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&d.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")})),(n.matchesSelector=Q.test(m=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&ut(function(e){n.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",I)}),d=d.length&&RegExp(d.join("|")),g=g.length&&RegExp(g.join("|")),y=Q.test(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,r){if(e===r)return E=!0,0;var i=r.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(r);return i?1&i||!n.sortDetached&&r.compareDocumentPosition(e)===i?e===t||y(b,e)?-1:r===t||y(b,r)?1:l?P.call(l,e)-P.call(l,r):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],u=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:l?P.call(l,e)-P.call(l,n):0;if(o===s)return ct(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)u.unshift(r);while(a[i]===u[i])i++;return i?ct(a[i],u[i]):a[i]===b?-1:u[i]===b?1:0},t):p},ot.matches=function(e,t){return ot(e,null,null,t)},ot.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Y,"='$1']"),!(!n.matchesSelector||!h||g&&g.test(t)||d&&d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return ot(t,p,null,[e]).length>0},ot.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},ot.attr=function(e,t){(e.ownerDocument||e)!==p&&c(e);var r=i.attrHandle[t.toLowerCase()],o=r&&A.call(i.attrHandle,t.toLowerCase())?r(e,t,!h):undefined;return o===undefined?n.attributes||!h?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null:o},ot.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},ot.uniqueSort=function(e){var t,r=[],i=0,o=0;if(E=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),E){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return e},o=ot.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=ot.selectors={cacheLength:50,createPseudo:at,match:J,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(nt,rt),e[3]=(e[4]||e[5]||"").replace(nt,rt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ot.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ot.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return J.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&V.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(nt,rt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=ot.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,h,d,g=o!==s?"nextSibling":"previousSibling",m=t.parentNode,y=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){p=t;while(p=p[g])if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[v]||(m[v]={}),l=c[e]||[],h=l[0]===w&&l[1],f=l[0]===w&&l[2],p=h&&m.childNodes[h];while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[w,h,f];break}}else if(x&&(l=(t[v]||(t[v]={}))[e])&&l[0]===w)f=l[1];else while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if((a?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(x&&((p[v]||(p[v]={}))[e]=[w,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ot.error("unsupported pseudo: "+e);return r[v]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?at(function(e,n){var i,o=r(e,t),s=o.length;while(s--)i=P.call(e,o[s]),e[i]=!(n[i]=o[s])}):function(e){return r(e,0,n)}):r}},pseudos:{not:at(function(e){var t=[],n=[],r=a(e.replace(z,"$1"));return r[v]?at(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:at(function(e){return function(t){return ot(e,t).length>0}}),contains:at(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:at(function(e){return G.test(e||"")||ot.error("unsupported lang: "+e),e=e.replace(nt,rt).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return et.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},i.pseudos.nth=i.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=ft(t);function dt(){}dt.prototype=i.filters=i.pseudos,i.setFilters=new dt;function gt(e,t){var n,r,o,s,a,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);a=e,u=[],l=i.preFilter;while(a){(!n||(r=_.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=X.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(z," ")}),a=a.slice(n.length));for(s in i.filter)!(r=J[s].exec(a))||l[s]&&!(r=l[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ot.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,n){var i=t.dir,o=n&&"parentNode"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,a){var u,l,c,p=w+" "+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[v]||(t[v]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,a)||r,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[v]&&(r=bt(r)),i&&!i[v]&&(i=bt(i,o)),at(function(o,s,a,u){var l,c,p,f=[],h=[],d=s.length,g=o||Ct(t||"*",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,f,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(p=l[c])&&(y[h[c]]=!(m[h[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?P.call(o,p):f[c])>-1&&(o[l]=!(s[l]=p))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):O.apply(s,y)})}function wt(e){var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[" "],l=s?1:0,c=yt(function(e){return e===t},a,!0),p=yt(function(e){return P.call(t,e)>-1},a,!0),f=[function(e,n,r){return!s&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>l;l++)if(n=i.relative[e[l].type])f=[yt(vt(f),n)];else{if(n=i.filter[e[l].type].apply(null,e[l].matches),n[v]){for(r=++l;o>r;r++)if(i.relative[e[r].type])break;return bt(l>1&&vt(f),l>1&&mt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&wt(e.slice(l,r)),o>r&&wt(e=e.slice(r)),o>r&&mt(e))}f.push(n)}return vt(f)}function Tt(e,t){var n=0,o=t.length>0,s=e.length>0,a=function(a,l,c,f,h){var d,g,m,y=[],v=0,x="0",b=a&&[],T=null!=h,C=u,k=a||s&&i.find.TAG("*",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(u=l!==p&&l,r=n);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,c)){f.push(d);break}T&&(w=N,r=++n)}o&&((d=!m&&d)&&v--,a&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,c);if(a){if(v>0)while(x--)b[x]||y[x]||(y[x]=q.call(f));y=xt(y)}O.apply(f,y),T&&!a&&y.length>0&&v+t.length>1&&ot.uniqueSort(f)}return T&&(w=N,u=C),b};return o?at(a):a}a=ot.compile=function(e,t){var n,r=[],i=[],o=N[e+" "];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[v]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ot(e,t[r],n);return n}function kt(e,t,r,o){var s,u,l,c,p,f=gt(e);if(!o&&1===f.length){if(u=f[0]=f[0].slice(0),u.length>2&&"ID"===(l=u[0]).type&&n.getById&&9===t.nodeType&&h&&i.relative[u[1].type]){if(t=(i.find.ID(l.matches[0].replace(nt,rt),t)||[])[0],!t)return r;e=e.slice(u.shift().value.length)}s=J.needsContext.test(e)?0:u.length;while(s--){if(l=u[s],i.relative[c=l.type])break;if((p=i.find[c])&&(o=p(l.matches[0].replace(nt,rt),U.test(u[0].type)&&t.parentNode||t))){if(u.splice(s,1),e=o.length&&mt(u),!e)return O.apply(r,o),r;break}}}return a(e,f)(o,t,!h,r,U.test(e)),r}n.sortStable=v.split("").sort(S).join("")===v,n.detectDuplicates=E,c(),n.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(p.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||lt("type|href|height|width",function(e,t,n){return n?undefined:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||lt("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?undefined:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||lt(R,function(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}),x.find=ot,x.expr=ot.selectors,x.expr[":"]=x.expr.pseudos,x.unique=ot.uniqueSort,x.text=ot.getText,x.isXMLDoc=ot.isXML,x.contains=ot.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(p){for(t=e.memory&&p,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(p[0],p[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!a||n&&!u||(t=t||[],t=[e,t.slice?t.slice():t],r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement("input"),r=o.createDocumentFragment(),i=o.createElement("div"),s=o.createElement("select"),a=s.appendChild(o.createElement("option"));return n.type?(n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement("input"),n.value="t",n.type="radio",t.radioValue="t"===n.value,n.setAttribute("checked","t"),n.setAttribute("name","t"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles="onfocusin"in e,i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===i.style.backgroundClip,x(function(){var n,r,s="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",a=o.getElementsByTagName("body")[0];a&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",a.appendChild(n).appendChild(i),i.innerHTML="",i.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(i,null)||{width:"4px"}).width,r=i.appendChild(o.createElement("div")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width="0",i.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if("string"==typeof t)o[t]=n;else if(x.isEmptyObject(o))x.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){var r;return t===undefined||t&&"string"==typeof t&&n===undefined?(r=this.get(e,t),r!==undefined?r:this.get(e,x.camelCase(t))):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(t===undefined)this.cache[o]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):(i=x.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(w)||[])),n=r.length;while(n--)delete s[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,"hasDataAttrs"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf("data-")&&(r=x.camelCase(r.slice(5)),P(i,r,s[r]));q.set(i,"hasDataAttrs",!0)}return s}return"object"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf("-")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(O,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t)</span> <span class='diff-add'>};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=undefined),e=e||"fx";while(s--)n=q.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\t\r\n\f]/g,$=/\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,i=0,o=x(this),s=e.match(w)||[];while(t=s[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===r||"boolean"===n)&&(this.className&&q.set(this,"__className__",this.className),this.className=this.className||e===!1?"":q.get(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(W," ").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,x(this).val()):e,null==i?i="":"number"==typeof i?i+="":x.isArray(i)&&(i=x.map(i,function(e){return null==e?"":e+""})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&t.set(this,i,"value")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,"string"==typeof n?n.replace($,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.bool.test(t)?M:R)),n===undefined?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&"set"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+""),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,p,f,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||"").match(w)||[""],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||"").split(".").sort(),d&&(f=x.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=x.event.special[d]||{},p=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(".")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,f.setup&&f.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),f.add&&(f.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,p):h.push(p),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,p,f,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){p=x.event.special[h]||{},h=(r?p.delegateType:p.bindType)||h,f=u[h]||[],a=a[2]&&RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=f.length;while(o--)c=f[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,p.remove&&p.remove.call(e,c));s&&!f.length&&(p.teardown&&p.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,"events"))}},trigger:function(t,n,r,i){var s,a,u,l,c,p,f,h=[r||o],d=y.call(t,"type")?t.type:t,g=y.call(t,"namespace")?t.namespace.split("."):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(".")>=0&&(g=d.split("."),d=g.shift(),g.sort()),c=0>d.indexOf(":")&&"on"+d,t=t[x.expando]?t:new x.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.namespace_re=t.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),f=x.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!x.isWindow(r)){for(l=f.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:f.bindType||d,p=(q.get(a,"events")||{})[t.type]&&q.get(a,"handle"),p&&p.apply(a,n),p=c&&a[c],p&&x.acceptData(a)&&p.apply&&p.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,"events")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+" ",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,s=e,a=this.fixHooks[i];a||(this.fixHooks[i]=a=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new x.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=o),3===e.target.nodeType&&(e.target=e.target.parentNode),a.filter?a.filter(e,s):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:"focusin"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&x.nodeName(this,"input")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&("string"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\[\.,]*$/,J=/^(?:parents|prev(?:Until|All))/,Q=x.expr.match.needsContext,K={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(et(this,e||[],!0))},filter:function(e){return this.pushStack(et(this,e||[],!1))},is:function(e){return!!et(this,"string"==typeof e&&Q.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],s=Q.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function Z(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return Z(e,"nextSibling")},prev:function(e){return Z(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return e.contentDocument||x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(K[e]||x.unique(i),J.test(e)&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function et(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,nt=/<([\w:]+)/,rt=/<|&#?\w+;/,it=/<(?:script|style|link)/i,ot=/^(?:checkbox|radio)$/i,st=/checked\s*(?:[^=]|=\s*.checked.)/i,at=/^$|\/(?:java|ecma)script/i,ut=/^true\/(.*)/,lt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ct={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(tt,"<$1></$2>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,"script"),s.length>0&&dt(s,!u&&mt(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement("div")),s=(nt.exec(i)||["",""])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,"<$1></$2>")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=""}else h.push(t.createTextNode(i));f.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),"script"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||"")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}});function pt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ot.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp("^("+b+")(.*)$","i"),Ct=RegExp("^("+b+")(?!px)[a-z%]+$","i"),kt=RegExp("^([+-])=("+b+")","i"),Nt={BODY:"block"},Et={position:"absolute",visibility:"hidden",display:"block"},St={letterSpacing:0,fontWeight:400},jt=["Top","Right","Bottom","Left"],Dt=["Webkit","O","Moz","ms"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[s]=q.access(r,"olddisplay",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),"normal"===i&&t in St&&(i=St[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ft(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+jt[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+jt[o]+"Width",!0,i))):(s+=x.css(e,"padding"+jt[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+jt[o]+"Width",!0,i)));return s}function Pt(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?"border":"content"),r,o)+"px"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),"none"!==n&&n||(xt=(xt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(xt[0].contentWindow||xt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=Mt(e,t),xt.detach()),Nt[e]=n),n}function Mt(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,t){x.cssHooks[t]={get:function(e,n,r){return n?0===e.offsetWidth&&bt.test(x.css(e,"display"))?x.swap(e,Et,function(){return Pt(e,t,r)}):Pt(e,t,r):undefined},set:function(e,n,r){var i=r&&qt(e);return Ot(e,n,r?Ft(e,t,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,t){return t?x.swap(e,{display:"inline-block"},vt,[e,"marginRight"]):undefined}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,t){x.cssHooks[t]={get:function(e,n){return n?(n=vt(e,t),Ct.test(n)?x(e).position()[t]+"px":n):undefined}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+jt[r]+t]=o[r]||o[r-2]||o[0];return i}},wt.test(e)||(x.cssHooks[e+t].set=Ot)});var Wt=/%20/g,$t=/\[\]$/,Bt=/\r?\n/g,It=/^(?:submit|button|image|reset|file)$/i,zt=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&zt.test(this.nodeName)&&!It.test(e)&&(this.checked||!ot.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(Bt,"\r\n")}}):{name:t.name,value:n.replace(Bt,"\r\n")}}).get()}}),x.param=function(e,t){var n,r=[],i=function(e,t){t=x.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(t===undefined&&(t=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){i(this.name,this.value)});else for(n in e)_t(n,e[n],t,i);return r.join("&").replace(Wt,"+")};function _t(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||$t.test(e)?r(e,i):_t(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)_t(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)</span> <span class='diff-add'>},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var Xt,Ut,Yt=x.now(),Vt=/\?/,Gt=/#.*$/,Jt=/([?&])_=[^&]*/,Qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Kt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Zt=/^(?:GET|HEAD)$/,en=/^\/\//,tn=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,nn=x.fn.load,rn={},on={},sn="*/".concat("*");try{Ut=i.href}catch(an){Ut=o.createElement("a"),Ut.href="",Ut=Ut.href}Xt=tn.exec(Ut.toLowerCase())||[];function un(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function ln(e,t,n,r){var i={},o=e===on;function s(a){var u;return i[a]=!0,x.each(e[a]||[],function(e,a){var l=a(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):undefined:(t.dataTypes.unshift(l),s(l),!1)}),u}return s(t.dataTypes[0])||!i["*"]&&s("*")}function cn(e,t){var n,r,i=x.ajaxSettings.flatOptions||{};for(n in t)t[n]!==undefined&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,t,n){if("string"!=typeof e&&nn)return nn.apply(this,arguments);var r,i,o,s=this,a=e.indexOf(" ");return a>=0&&(r=e.slice(a),e=e.slice(0,a)),x.isFunction(t)?(n=t,t=undefined):t&&"object"==typeof t&&(i="POST"),s.length>0&&x.ajax({url:e,type:i,dataType:"html",data:t}).done(function(e){o=arguments,s.html(r?x("<div>").append(x.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){s.each(n,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ut,type:"GET",isLocal:Kt.test(Xt[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":sn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?cn(cn(e,x.ajaxSettings),t):cn(x.ajaxSettings,e)},ajaxPrefilter:un(rn),ajaxTransport:un(on),ajax:function(e,t){"object"==typeof e&&(t=e,e=undefined),t=t||{};var n,r,i,o,s,a,u,l,c=x.ajaxSetup({},t),p=c.context||c,f=c.context&&(p.nodeType||p.jquery)?x(p):x.event,h=x.Deferred(),d=x.Callbacks("once memory"),g=c.statusCode||{},m={},y={},v=0,b="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===v){if(!o){o={};while(t=Qt.exec(i))o[t[1].toLowerCase()]=t[2]}t=o[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===v?i:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return v||(e=y[n]=y[n]||e,m[e]=t),this},overrideMimeType:function(e){return v||(c.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>v)for(t in e)g[t]=[g[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||b;return n&&n.abort(t),k(0,t),this}};if(h.promise(T).complete=d.add,T.success=T.done,T.error=T.fail,c.url=((e||c.url||Ut)+"").replace(Gt,"").replace(en,Xt[1]+"//"),c.type=t.method||t.type||c.method||c.type,c.dataTypes=x.trim(c.dataType||"*").toLowerCase().match(w)||[""],null==c.crossDomain&&(a=tn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===Xt[1]&&a[2]===Xt[2]&&(a[3]||("http:"===a[1]?"80":"443"))===(Xt[3]||("http:"===Xt[1]?"80":"443")))),c.data&&c.processData&&"string"!=typeof c.data&&(c.data=x.param(c.data,c.traditional)),ln(rn,c,t,T),2===v)return T;u=c.global,u&&0===x.active++&&x.event.trigger("ajaxStart"),c.type=c.type.toUpperCase(),c.hasContent=!Zt.test(c.type),r=c.url,c.hasContent||(c.data&&(r=c.url+=(Vt.test(r)?"&":"?")+c.data,delete c.data),c.cache===!1&&(c.url=Jt.test(r)?r.replace(Jt,"$1_="+Yt++):r+(Vt.test(r)?"&":"?")+"_="+Yt++)),c.ifModified&&(x.lastModified[r]&&T.setRequestHeader("If-Modified-Since",x.lastModified[r]),x.etag[r]&&T.setRequestHeader("If-None-Match",x.etag[r])),(c.data&&c.hasContent&&c.contentType!==!1||t.contentType)&&T.setRequestHeader("Content-Type",c.contentType),T.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+("*"!==c.dataTypes[0]?", "+sn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)T.setRequestHeader(l,c.headers[l]);if(c.beforeSend&&(c.beforeSend.call(p,T,c)===!1||2===v))return T.abort();b="abort";for(l in{success:1,error:1,complete:1})T[l](c[l]);if(n=ln(on,c,t,T)){T.readyState=1,u&&f.trigger("ajaxSend",[T,c]),c.async&&c.timeout>0&&(s=setTimeout(function(){T.abort("timeout")},c.timeout));try{v=1,n.send(m,k)}catch(C){if(!(2>v))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,t,o,a){var l,m,y,b,w,C=t;2!==v&&(v=2,s&&clearTimeout(s),n=undefined,i=a||"",T.readyState=e>0?4:0,l=e>=200&&300>e||304===e,o&&(b=pn(c,T,o)),b=fn(c,b,T,l),l?(c.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(x.lastModified[r]=w),w=T.getResponseHeader("etag"),w&&(x.etag[r]=w)),204===e||"HEAD"===c.type?C="nocontent":304===e?C="notmodified":(C=b.state,m=b.data,y=b.error,l=!y)):(y=C,(e||!C)&&(C="error",0>e&&(e=0))),T.status=e,T.statusText=(t||C)+"",l?h.resolveWith(p,[m,C,T]):h.rejectWith(p,[T,C,y]),T.statusCode(g),g=undefined,u&&f.trigger(l?"ajaxSuccess":"ajaxError",[T,c,l?m:y]),d.fireWith(p,[T,C]),u&&(f.trigger("ajaxComplete",[T,c]),--x.active||x.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,t){return x.get(e,undefined,t,"script")}}),x.each(["get","post"],function(e,t){x[t]=function(e,n,r,i){return x.isFunction(n)&&(i=i||r,r=n,n=undefined),x.ajax({url:e,type:t,dataType:i,data:n,success:r})}});function pn(e,t,n){var r,i,o,s,a=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),r===undefined&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}s||(s=i)}o=o||s}return o?(o!==u[0]&&u.unshift(o),n[o]):undefined}function fn(e,t,n,r){var i,o,s,a,u,l={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)l[s.toLowerCase()]=e.converters[s];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(s=l[u+" "+o]||l["* "+o],!s)for(i in l)if(a=i.split(" "),a[1]===o&&(s=l[u+" "+a[0]]||l["* "+a[0]])){s===!0?s=l[i]:l[i]!==!0&&(o=a[0],c.unshift(a[1]));break}if(s!==!0)if(s&&e["throws"])t=s(t);else try{t=s(t)}catch(p){return{state:"parsererror",error:s?p:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),x.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=x("<script>").prop({async:!0,charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&i("error"===e.type?404:200,e.type)}),o.head.appendChild(t[0])},abort:function(){n&&n()}}}});var hn=[],dn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=hn.pop()||x.expando+"_"+Yt++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,s,a=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");return a||"jsonp"===t.dataTypes[0]?(i=t.jsonpCallback=x.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(Vt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return s||x.error(i+" was not called"),s[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){s=arguments},r.always(function(){e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,hn.push(i)),s&&x.isFunction(o)&&o(s[0]),s=o=undefined}),"script"):undefined}),x.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(e){}};var gn=x.ajaxSettings.xhr(),mn={0:200,1223:204},yn=0,vn={};e.ActiveXObject&&x(e).on("unload",function(){for(var e in vn)vn[e]();vn=undefined}),x.support.cors=!!gn&&"withCredentials"in gn,x.support.ajax=gn=!!gn,x.ajaxTransport(function(e){var t;return x.support.cors||gn&&!e.crossDomain?{send:function(n,r){var i,o,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)s[i]=e.xhrFields[i];e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(i in n)s.setRequestHeader(i,n[i]);t=function(e){return function(){t&&(delete vn[o],t=s.onload=s.onerror=null,"abort"===e?s.abort():"error"===e?r(s.status||404,s.statusText):r(mn[s.status]||s.status,s.statusText,"string"==typeof s.responseText?{text:s.responseText}:undefined,s.getAllResponseHeaders()))}},s.onload=t(),s.onerror=t("error"),t=vn[o=yn++]=t("abort"),s.send(e.hasContent&&e.data||null)},abort:function(){t&&t()}}:undefined});var xn,bn,wn=/^(?:toggle|show|hide)$/,Tn=RegExp("^(?:([+-])=|)("+b+")([a-z%]*)$","i"),Cn=/queueHooks$/,kn=[An],Nn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Tn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),s=(x.cssNumber[e]||"px"!==o&&+r)&&Tn.exec(x.css(n.elem,e)),a=1,u=20;if(s&&s[3]!==o){o=o||s[3],i=i||[],s=+r||1;do a=a||".5",s/=a,x.style(n.elem,e,s+o);while(a!==(a=n.cur()/r)&&1!==a&&--u)}return i&&(s=n.start=+s||+r||0,n.unit=o,n.end=i[1]?s+(i[1]+1)*i[2]:+i[2]),n}]};function En(){return setTimeout(function(){xn=undefined}),xn=x.now()}function Sn(e,t,n){var r,i=(Nn[t]||[]).concat(Nn["*"]),o=0,s=i.length;for(;s>o;o++)if(r=i[o].call(n,t,e))return r}function jn(e,t,n){var r,i,o=0,s=kn.length,a=x.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=xn||En(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,s=0,u=l.tweens.length;for(;u>s;s++)l.tweens[s].run(o);return a.notifyWith(e,[l,o,n]),1>o&&u?n:(a.resolveWith(e,[l]),!1)},l=a.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:xn||En(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?a.resolveWith(e,[l,t]):a.rejectWith(e,[l,t]),this}}),c=l.props;for(Dn(c,l.opts.specialEasing);s>o;o++)if(r=kn[o].call(l,e,c,l.opts))return r;return x.map(c,Sn,l),x.isFunction(l.opts.start)&&l.opts.start.call(e,l),x.fx.timer(x.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function Dn(e,t){var n,r,i,o,s;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),s=x.cssHooks[r],s&&"expand"in s){o=s.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(jn,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Nn[n]=Nn[n]||[],Nn[n].unshift(t)},prefilter:function(e,t){t?kn.unshift(e):kn.push(e)}});function An(e,t,n){var r,i,o,s,a,u,l=this,c={},p=e.style,f=e.nodeType&&Lt(e),h=q.get(e,"fxshow");n.queue||(a=x._queueHooks(e,"fx"),null==a.unqueued&&(a.unqueued=0,u=a.empty.fire,a.empty.fire=function(){a.unqueued||u()}),a.unqueued++,l.always(function(){l.always(function(){a.unqueued--,x.queue(e,"fx").length||a.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(p.display="inline-block")),n.overflow&&(p.overflow="hidden",l.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],wn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show")){if("show"!==i||!h||h[r]===undefined)continue;f=!0}c[r]=h&&h[r]||x.style(e,r)}if(!x.isEmptyObject(c)){h?"hidden"in h&&(f=h.hidden):h=q.access(e,"fxshow",{}),o&&(h.hidden=!f),f?x(e).show():l.done(function(){x(e).hide()}),l.done(function(){var t;q.remove(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)s=Sn(f?h[r]:0,r,l),r in h||(h[r]=s.start,f&&(s.end=s.start,s.start="width"===r||"height"===r?1:0))}}function Ln(e,t,n,r,i){return new Ln.prototype.init(e,t,n,r,i)}x.Tween=Ln,Ln.prototype={constructor:Ln,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=Ln.propHooks[this.prop];return e&&e.get?e.get(this):Ln.propHooks._default.get(this)},run:function(e){var t,n=Ln.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ln.propHooks._default.set(this),this}},Ln.prototype.init.prototype=Ln.prototype,Ln.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Ln.propHooks.scrollTop=Ln.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(qn(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Lt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),s=function(){var t=jn(this,x.extend({},e),o);(i||q.get(this,"finish"))&&t.stop(!0)};return s.finish=s,i||o.queue===!1?this.each(s):this.queue(o.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=undefined),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=x.timers,s=q.get(this);if(i)s[i]&&s[i].stop&&r(s[i]);else for(i in s)s[i]&&s[i].stop&&Cn.test(i)&&r(s[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=q.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,s=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;s>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function qn(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=jt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:qn("show"),slideUp:qn("hide"),slideToggle:qn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=Ln.prototype.init,x.fx.tick=function(){var e,t=x.timers,n=0;for(xn=x.now();t.length>n;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||x.fx.stop(),xn=undefined},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){bn||(bn=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(bn),bn=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===undefined?this:this.each(function(t){x.offset.setOffset(this,e,t)});var t,n,i=this[0],o={top:0,left:0},s=i&&i.ownerDocument;if(s)return t=s.documentElement,x.contains(t,i)?(typeof i.getBoundingClientRect!==r&&(o=i.getBoundingClientRect()),n=Hn(s),{top:o.top+n.pageYOffset-t.clientTop,left:o.left+n.pageXOffset-t.clientLeft}):o},x.offset={setOffset:function(e,t,n){var r,i,o,s,a,u,l,c=x.css(e,"position"),p=x(e),f={};"static"===c&&(e.style.position="relative"),a=p.offset(),o=x.css(e,"top"),u=x.css(e,"left"),l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1,l?(r=p.position(),s=r.top,i=r.left):(s=parseFloat(o)||0,i=parseFloat(u)||0),x.isFunction(t)&&(t=t.call(e,n,a)),null!=t.top&&(f.top=t.top-a.top+s),null!=t.left&&(f.left=t.left-a.left+i),"using"in t?t.using.call(e,f):p.css(f)}},x.fn.extend({position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return"fixed"===x.css(n,"position")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(r=e.offset()),r.top+=x.css(e[0],"borderTopWidth",!0),r.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-r.top-x.css(n,"marginTop",!0),left:t.left-r.left-x.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,n){var r="pageYOffset"===n;x.fn[t]=function(i){return x.access(this,function(t,i,o){var s=Hn(t);return o===undefined?s?s[n]:t[i]:(s?s.scrollTo(r?e.pageXOffset:o,r?o:e.pageYOffset):t[i]=o,undefined)},t,i,arguments.length,null)}});function Hn(e){return x.isWindow(e)?e:9===e.nodeType&&e.defaultView}x.each({Height:"height",Width:"width"},function(e,t){x.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){x.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),s=n||(r===!0||i===!0?"margin":"border");return x.access(this,function(t,n,r){var i;return x.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):r===undefined?x.css(t,n,s):x.style(t,n,r,s)},t,o?r:undefined,o,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}),"object"==typeof e&&"object"==typeof e.document&&(e.jQuery=e.$=x)})(window);</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/kernel.js b/ipynb/Array-feature-overlap-05_files/kernel.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..f414507</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/kernel.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> './comm',</span> <span class='diff-add'> './serialize',</span> <span class='diff-add'> 'widgets/js/init'</span> <span class='diff-add'>], function(IPython, $, utils, comm, serialize, widgetmanager) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> /**</span> <span class='diff-add'> * A Kernel class to communicate with the Python kernel. This</span> <span class='diff-add'> * should generally not be constructed directly, but be created</span> <span class='diff-add'> * by. the `Session` object. Once created, this object should be</span> <span class='diff-add'> * used to communicate with the kernel.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @class Kernel</span> <span class='diff-add'> * @param {string} kernel_service_url - the URL to access the kernel REST api</span> <span class='diff-add'> * @param {string} ws_url - the websockets URL</span> <span class='diff-add'> * @param {Notebook} notebook - notebook object</span> <span class='diff-add'> * @param {string} name - the kernel type (e.g. python3)</span> <span class='diff-add'> */</span> <span class='diff-add'> var Kernel = function (kernel_service_url, ws_url, notebook, name) {</span> <span class='diff-add'> this.events = notebook.events;</span> <span class='diff-add'> this.id = null;</span> <span class='diff-add'> this.name = name;</span> <span class='diff-add'> this.ws = null;</span> <span class='diff-add'> this.kernel_service_url = kernel_service_url;</span> <span class='diff-add'> this.kernel_url = null;</span> <span class='diff-add'> this.ws_url = ws_url || IPython.utils.get_body_data("wsUrl");</span> <span class='diff-add'> if (!this.ws_url) {</span> <span class='diff-add'> // trailing 's' in https will become wss for secure web sockets</span> <span class='diff-add'> this.ws_url = location.protocol.replace('http', 'ws') + "//" + location.host;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.username = "username";</span> <span class='diff-add'> this.session_id = utils.uuid();</span> <span class='diff-add'> this._msg_callbacks = {};</span> <span class='diff-add'> this.info_reply = {}; // kernel_info_reply stored here after starting</span> <span class='diff-add'> if (typeof(WebSocket) !== 'undefined') {</span> <span class='diff-add'> this.WebSocket = WebSocket;</span> <span class='diff-add'> } else if (typeof(MozWebSocket) !== 'undefined') {</span> <span class='diff-add'> this.WebSocket = MozWebSocket;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> alert('Your browser does not have WebSocket support, please try Chrome, Safari or Firefox ≥ 6. Firefox 4 and 5 are also supported by you have to enable WebSockets in about:config.');</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> this.bind_events();</span> <span class='diff-add'> this.init_iopub_handlers();</span> <span class='diff-add'> this.comm_manager = new comm.CommManager(this);</span> <span class='diff-add'> this.widget_manager = new widgetmanager.WidgetManager(this.comm_manager, notebook);</span> <span class='diff-add'> </span> <span class='diff-add'> this.last_msg_id = null;</span> <span class='diff-add'> this.last_msg_callbacks = {};</span> <span class='diff-add'> this._autorestart_attempt = 0;</span> <span class='diff-add'> this._reconnect_attempt = 0;</span> <span class='diff-add'> this.reconnect_limit = 7;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @function _get_msg</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype._get_msg = function (msg_type, content, metadata, buffers) {</span> <span class='diff-add'> var msg = {</span> <span class='diff-add'> header : {</span> <span class='diff-add'> msg_id : utils.uuid(),</span> <span class='diff-add'> username : this.username,</span> <span class='diff-add'> session : this.session_id,</span> <span class='diff-add'> msg_type : msg_type,</span> <span class='diff-add'> version : "5.0"</span> <span class='diff-add'> },</span> <span class='diff-add'> metadata : metadata || {},</span> <span class='diff-add'> content : content,</span> <span class='diff-add'> buffers : buffers || [],</span> <span class='diff-add'> parent_header : {}</span> <span class='diff-add'> };</span> <span class='diff-add'> return msg;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @function bind_events</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype.bind_events = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.events.on('send_input_reply.Kernel', function(evt, data) { </span> <span class='diff-add'> that.send_input_reply(data);</span> <span class='diff-add'> });</span> <span class='diff-add'> var record_status = function (evt, info) {</span> <span class='diff-add'> console.log('Kernel: ' + evt.type + ' (' + info.kernel.id + ')');</span> <span class='diff-add'> };</span> <span class='diff-add'> this.events.on('kernel_created.Kernel', record_status);</span> <span class='diff-add'> this.events.on('kernel_reconnecting.Kernel', record_status);</span> <span class='diff-add'> this.events.on('kernel_connected.Kernel', record_status);</span> <span class='diff-add'> this.events.on('kernel_starting.Kernel', record_status);</span> <span class='diff-add'> this.events.on('kernel_restarting.Kernel', record_status);</span> <span class='diff-add'> this.events.on('kernel_autorestarting.Kernel', record_status);</span> <span class='diff-add'> this.events.on('kernel_interrupting.Kernel', record_status);</span> <span class='diff-add'> this.events.on('kernel_disconnected.Kernel', record_status);</span> <span class='diff-add'> // these are commented out because they are triggered a lot, but can</span> <span class='diff-add'> // be uncommented for debugging purposes</span> <span class='diff-add'> //this.events.on('kernel_idle.Kernel', record_status);</span> <span class='diff-add'> //this.events.on('kernel_busy.Kernel', record_status);</span> <span class='diff-add'> this.events.on('kernel_ready.Kernel', record_status);</span> <span class='diff-add'> this.events.on('kernel_killed.Kernel', record_status);</span> <span class='diff-add'> this.events.on('kernel_dead.Kernel', record_status);</span> <span class='diff-add'> this.events.on('kernel_ready.Kernel', function () {</span> <span class='diff-add'> that._autorestart_attempt = 0;</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_connected.Kernel', function () {</span> <span class='diff-add'> that._reconnect_attempt = 0;</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Initialize the iopub handlers.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function init_iopub_handlers</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype.init_iopub_handlers = function () {</span> <span class='diff-add'> var output_msg_types = ['stream', 'display_data', 'execute_result', 'error'];</span> <span class='diff-add'> this._iopub_handlers = {};</span> <span class='diff-add'> this.register_iopub_handler('status', $.proxy(this._handle_status_message, this));</span> <span class='diff-add'> this.register_iopub_handler('clear_output', $.proxy(this._handle_clear_output, this));</span> <span class='diff-add'> this.register_iopub_handler('execute_input', $.proxy(this._handle_input_message, this));</span> <span class='diff-add'> </span> <span class='diff-add'> for (var i=0; i < output_msg_types.length; i++) {</span> <span class='diff-add'> this.register_iopub_handler(output_msg_types[i], $.proxy(this._handle_output_message, this));</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * GET /api/kernels</span> <span class='diff-add'> *</span> <span class='diff-add'> * Get the list of running kernels.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function list</span> <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span> <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype.list = function (success, error) {</span> <span class='diff-add'> $.ajax(this.kernel_service_url, {</span> <span class='diff-add'> processData: false,</span> <span class='diff-add'> cache: false,</span> <span class='diff-add'> type: "GET",</span> <span class='diff-add'> dataType: "json",</span> <span class='diff-add'> success: success,</span> <span class='diff-add'> error: this._on_error(error)</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * POST /api/kernels</span> <span class='diff-add'> *</span> <span class='diff-add'> * Start a new kernel.</span> <span class='diff-add'> *</span> <span class='diff-add'> * In general this shouldn't be used -- the kernel should be</span> <span class='diff-add'> * started through the session API. If you use this function and</span> <span class='diff-add'> * are also using the session API then your session and kernel</span> <span class='diff-add'> * WILL be out of sync!</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function start</span> <span class='diff-add'> * @param {params} [Object] - parameters to include in the query string</span> <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span> <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype.start = function (params, success, error) {</span> <span class='diff-add'> var url = this.kernel_service_url;</span> <span class='diff-add'> var qs = $.param(params || {}); // query string for sage math stuff</span> <span class='diff-add'> if (qs !== "") {</span> <span class='diff-add'> url = url + "?" + qs;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.events.trigger('kernel_starting.Kernel', {kernel: this});</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var on_success = function (data, status, xhr) {</span> <span class='diff-add'> that.events.trigger('kernel_created.Kernel', {kernel: that});</span> <span class='diff-add'> that._kernel_created(data);</span> <span class='diff-add'> if (success) {</span> <span class='diff-add'> success(data, status, xhr);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> $.ajax(url, {</span> <span class='diff-add'> processData: false,</span> <span class='diff-add'> cache: false,</span> <span class='diff-add'> type: "POST",</span> <span class='diff-add'> data: JSON.stringify({name: this.name}),</span> <span class='diff-add'> dataType: "json",</span> <span class='diff-add'> success: this._on_success(on_success),</span> <span class='diff-add'> error: this._on_error(error)</span> <span class='diff-add'> });</span> <span class='diff-add'> return url;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * GET /api/kernels/[:kernel_id]</span> <span class='diff-add'> *</span> <span class='diff-add'> * Get information about the kernel.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function get_info</span> <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span> <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype.get_info = function (success, error) {</span> <span class='diff-add'> $.ajax(this.kernel_url, {</span> <span class='diff-add'> processData: false,</span> <span class='diff-add'> cache: false,</span> <span class='diff-add'> type: "GET",</span> <span class='diff-add'> dataType: "json",</span> <span class='diff-add'> success: this._on_success(success),</span> <span class='diff-add'> error: this._on_error(error)</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * DELETE /api/kernels/[:kernel_id]</span> <span class='diff-add'> *</span> <span class='diff-add'> * Shutdown the kernel.</span> <span class='diff-add'> *</span> <span class='diff-add'> * If you are also using sessions, then this function shoul NOT be</span> <span class='diff-add'> * used. Instead, use Session.delete. Otherwise, the session and</span> <span class='diff-add'> * kernel WILL be out of sync.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function kill</span> <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span> <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype.kill = function (success, error) {</span> <span class='diff-add'> this.events.trigger('kernel_killed.Kernel', {kernel: this});</span> <span class='diff-add'> this._kernel_dead();</span> <span class='diff-add'> $.ajax(this.kernel_url, {</span> <span class='diff-add'> processData: false,</span> <span class='diff-add'> cache: false,</span> <span class='diff-add'> type: "DELETE",</span> <span class='diff-add'> dataType: "json",</span> <span class='diff-add'> success: this._on_success(success),</span> <span class='diff-add'> error: this._on_error(error)</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * POST /api/kernels/[:kernel_id]/interrupt</span> <span class='diff-add'> *</span> <span class='diff-add'> * Interrupt the kernel.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function interrupt</span> <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span> <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype.interrupt = function (success, error) {</span> <span class='diff-add'> this.events.trigger('kernel_interrupting.Kernel', {kernel: this});</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var on_success = function (data, status, xhr) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * get kernel info so we know what state the kernel is in</span> <span class='diff-add'> */</span> <span class='diff-add'> that.kernel_info();</span> <span class='diff-add'> if (success) {</span> <span class='diff-add'> success(data, status, xhr);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var url = utils.url_join_encode(this.kernel_url, 'interrupt');</span> <span class='diff-add'> $.ajax(url, {</span> <span class='diff-add'> processData: false,</span> <span class='diff-add'> cache: false,</span> <span class='diff-add'> type: "POST",</span> <span class='diff-add'> dataType: "json",</span> <span class='diff-add'> success: this._on_success(on_success),</span> <span class='diff-add'> error: this._on_error(error)</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype.restart = function (success, error) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * POST /api/kernels/[:kernel_id]/restart</span> <span class='diff-add'> *</span> <span class='diff-add'> * Restart the kernel.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function interrupt</span> <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span> <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span> <span class='diff-add'> */</span> <span class='diff-add'> this.events.trigger('kernel_restarting.Kernel', {kernel: this});</span> <span class='diff-add'> this.stop_channels();</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var on_success = function (data, status, xhr) {</span> <span class='diff-add'> that.events.trigger('kernel_created.Kernel', {kernel: that});</span> <span class='diff-add'> that._kernel_created(data);</span> <span class='diff-add'> if (success) {</span> <span class='diff-add'> success(data, status, xhr);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var on_error = function (xhr, status, err) {</span> <span class='diff-add'> that.events.trigger('kernel_dead.Kernel', {kernel: that});</span> <span class='diff-add'> that._kernel_dead();</span> <span class='diff-add'> if (error) {</span> <span class='diff-add'> error(xhr, status, err);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var url = utils.url_join_encode(this.kernel_url, 'restart');</span> <span class='diff-add'> $.ajax(url, {</span> <span class='diff-add'> processData: false,</span> <span class='diff-add'> cache: false,</span> <span class='diff-add'> type: "POST",</span> <span class='diff-add'> dataType: "json",</span> <span class='diff-add'> success: this._on_success(on_success),</span> <span class='diff-add'> error: this._on_error(on_error)</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype.reconnect = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Reconnect to a disconnected kernel. This is not actually a</span> <span class='diff-add'> * standard HTTP request, but useful function nonetheless for</span> <span class='diff-add'> * reconnecting to the kernel if the connection is somehow lost.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function reconnect</span> <span class='diff-add'> */</span> <span class='diff-add'> if (this.is_connected()) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this._reconnect_attempt = this._reconnect_attempt + 1;</span> <span class='diff-add'> this.events.trigger('kernel_reconnecting.Kernel', {</span> <span class='diff-add'> kernel: this,</span> <span class='diff-add'> attempt: this._reconnect_attempt,</span> <span class='diff-add'> });</span> <span class='diff-add'> this.start_channels();</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype._on_success = function (success) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle a successful AJAX request by updating the kernel id and</span> <span class='diff-add'> * name from the response, and then optionally calling a provided</span> <span class='diff-add'> * callback.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function _on_success</span> <span class='diff-add'> * @param {function} success - callback</span> <span class='diff-add'> */</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> return function (data, status, xhr) {</span> <span class='diff-add'> if (data) {</span> <span class='diff-add'> that.id = data.id;</span> <span class='diff-add'> that.name = data.name;</span> <span class='diff-add'> }</span> <span class='diff-add'> that.kernel_url = utils.url_join_encode(that.kernel_service_url, that.id);</span> <span class='diff-add'> if (success) {</span> <span class='diff-add'> success(data, status, xhr);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype._on_error = function (error) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle a failed AJAX request by logging the error message, and</span> <span class='diff-add'> * then optionally calling a provided callback.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function _on_error</span> <span class='diff-add'> * @param {function} error - callback</span> <span class='diff-add'> */</span> <span class='diff-add'> return function (xhr, status, err) {</span> <span class='diff-add'> utils.log_ajax_error(xhr, status, err);</span> <span class='diff-add'> if (error) {</span> <span class='diff-add'> error(xhr, status, err);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype._kernel_created = function (data) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Perform necessary tasks once the kernel has been started,</span> <span class='diff-add'> * including actually connecting to the kernel.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function _kernel_created</span> <span class='diff-add'> * @param {Object} data - information about the kernel including id</span> <span class='diff-add'> */</span> <span class='diff-add'> this.id = data.id;</span> <span class='diff-add'> this.kernel_url = utils.url_join_encode(this.kernel_service_url, this.id);</span> <span class='diff-add'> this.start_channels();</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype._kernel_connected = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Perform necessary tasks once the connection to the kernel has</span> <span class='diff-add'> * been established. This includes requesting information about</span> <span class='diff-add'> * the kernel.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function _kernel_connected</span> <span class='diff-add'> */</span> <span class='diff-add'> this.events.trigger('kernel_connected.Kernel', {kernel: this});</span> <span class='diff-add'> // get kernel info so we know what state the kernel is in</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.kernel_info(function (reply) {</span> <span class='diff-add'> that.info_reply = reply.content;</span> <span class='diff-add'> that.events.trigger('kernel_ready.Kernel', {kernel: that});</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype._kernel_dead = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Perform necessary tasks after the kernel has died. This closing</span> <span class='diff-add'> * communication channels to the kernel if they are still somehow</span> <span class='diff-add'> * open.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function _kernel_dead</span> <span class='diff-add'> */</span> <span class='diff-add'> this.stop_channels();</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype.start_channels = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Start the websocket channels.</span> <span class='diff-add'> * Will stop and restart them if they already exist.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function start_channels</span> <span class='diff-add'> */</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.stop_channels();</span> <span class='diff-add'> var ws_host_url = this.ws_url + this.kernel_url;</span> <span class='diff-add'> console.log("Starting WebSockets:", ws_host_url);</span> <span class='diff-add'> </span> <span class='diff-add'> this.ws = new this.WebSocket([</span> <span class='diff-add'> that.ws_url,</span> <span class='diff-add'> utils.url_join_encode(that.kernel_url, 'channels'),</span> <span class='diff-add'> "?session_id=" + that.session_id</span> <span class='diff-add'> ].join('')</span> <span class='diff-add'> );</span> <span class='diff-add'> </span> <span class='diff-add'> var already_called_onclose = false; // only alert once</span> <span class='diff-add'> var ws_closed_early = function(evt){</span> <span class='diff-add'> if (already_called_onclose){</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> already_called_onclose = true;</span> <span class='diff-add'> if ( ! evt.wasClean ){</span> <span class='diff-add'> // If the websocket was closed early, that could mean</span> <span class='diff-add'> // that the kernel is actually dead. Try getting</span> <span class='diff-add'> // information about the kernel from the API call --</span> <span class='diff-add'> // if that fails, then assume the kernel is dead,</span> <span class='diff-add'> // otherwise just follow the typical websocket closed</span> <span class='diff-add'> // protocol.</span> <span class='diff-add'> that.get_info(function () {</span> <span class='diff-add'> that._ws_closed(ws_host_url, false);</span> <span class='diff-add'> }, function () {</span> <span class='diff-add'> that.events.trigger('kernel_dead.Kernel', {kernel: that});</span> <span class='diff-add'> that._kernel_dead();</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var ws_closed_late = function(evt){</span> <span class='diff-add'> if (already_called_onclose){</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> already_called_onclose = true;</span> <span class='diff-add'> if ( ! evt.wasClean ){</span> <span class='diff-add'> that._ws_closed(ws_host_url, false);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var ws_error = function(evt){</span> <span class='diff-add'> if (already_called_onclose){</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> already_called_onclose = true;</span> <span class='diff-add'> that._ws_closed(ws_host_url, true);</span> <span class='diff-add'> };</span> <span class='diff-add'> this.ws.onopen = $.proxy(this._ws_opened, this);</span> <span class='diff-add'> this.ws.onclose = ws_closed_early;</span> <span class='diff-add'> this.ws.onerror = ws_error;</span> <span class='diff-add'> // switch from early-close to late-close message after 1s</span> <span class='diff-add'> setTimeout(function() {</span> <span class='diff-add'> if (that.ws !== null) {</span> <span class='diff-add'> that.ws.onclose = ws_closed_late;</span> <span class='diff-add'> }</span> <span class='diff-add'> }, 1000);</span> <span class='diff-add'> this.ws.onmessage = $.proxy(this._handle_ws_message, this);</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype._ws_opened = function (evt) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle a websocket entering the open state,</span> <span class='diff-add'> * signaling that the kernel is connected when websocket is open.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function _ws_opened</span> <span class='diff-add'> */</span> <span class='diff-add'> if (this.is_connected()) {</span> <span class='diff-add'> // all events ready, trigger started event.</span> <span class='diff-add'> this._kernel_connected();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype._ws_closed = function(ws_url, error) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle a websocket entering the closed state. If the websocket</span> <span class='diff-add'> * was not closed due to an error, try to reconnect to the kernel.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function _ws_closed</span> <span class='diff-add'> * @param {string} ws_url - the websocket url</span> <span class='diff-add'> * @param {bool} error - whether the connection was closed due to an error</span> <span class='diff-add'> */</span> <span class='diff-add'> this.stop_channels();</span> <span class='diff-add'> this.events.trigger('kernel_disconnected.Kernel', {kernel: this});</span> <span class='diff-add'> if (error) {</span> <span class='diff-add'> console.log('WebSocket connection failed: ', ws_url);</span> <span class='diff-add'> this.events.trigger('kernel_connection_failed.Kernel', {kernel: this, ws_url: ws_url, attempt: this._reconnect_attempt});</span> <span class='diff-add'> }</span> <span class='diff-add'> this._schedule_reconnect();</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> Kernel.prototype._schedule_reconnect = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * function to call when kernel connection is lost</span> <span class='diff-add'> * schedules reconnect, or fires 'connection_dead' if reconnect limit is hit</span> <span class='diff-add'> */</span> <span class='diff-add'> if (this._reconnect_attempt < this.reconnect_limit) {</span> <span class='diff-add'> var timeout = Math.pow(2, this._reconnect_attempt);</span> <span class='diff-add'> console.log("Connection lost, reconnecting in " + timeout + " seconds.");</span> <span class='diff-add'> setTimeout($.proxy(this.reconnect, this), 1e3 * timeout);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.events.trigger('kernel_connection_dead.Kernel', {</span> <span class='diff-add'> kernel: this,</span> <span class='diff-add'> reconnect_attempt: this._reconnect_attempt,</span> <span class='diff-add'> });</span> <span class='diff-add'> console.log("Failed to reconnect, giving up.");</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> Kernel.prototype.stop_channels = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Close the websocket. After successful close, the value</span> <span class='diff-add'> * in `this.ws` will be null.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function stop_channels</span> <span class='diff-add'> */</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var close = function () {</span> <span class='diff-add'> if (that.ws && that.ws.readyState === WebSocket.CLOSED) {</span> <span class='diff-add'> that.ws = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> if (this.ws !== null) {</span> <span class='diff-add'> if (this.ws.readyState === WebSocket.OPEN) {</span> <span class='diff-add'> this.ws.onclose = close;</span> <span class='diff-add'> this.ws.close();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> close();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype.is_connected = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Check whether there is a connection to the kernel. This</span> <span class='diff-add'> * function only returns true if websocket has been</span> <span class='diff-add'> * created and has a state of WebSocket.OPEN.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function is_connected</span> <span class='diff-add'> * @returns {bool} - whether there is a connection</span> <span class='diff-add'> */</span> <span class='diff-add'> // if any channel is not ready, then we're not connected</span> <span class='diff-add'> if (this.ws === null) {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.ws.readyState !== WebSocket.OPEN) {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> return true;</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype.is_fully_disconnected = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Check whether the connection to the kernel has been completely</span> <span class='diff-add'> * severed. This function only returns true if all channel objects</span> <span class='diff-add'> * are null.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function is_fully_disconnected</span> <span class='diff-add'> * @returns {bool} - whether the kernel is fully disconnected</span> <span class='diff-add'> */</span> <span class='diff-add'> return (this.ws === null);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> Kernel.prototype.send_shell_message = function (msg_type, content, callbacks, metadata, buffers) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Send a message on the Kernel's shell channel</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function send_shell_message</span> <span class='diff-add'> */</span> <span class='diff-add'> if (!this.is_connected()) {</span> <span class='diff-add'> throw new Error("kernel is not connected");</span> <span class='diff-add'> }</span> <span class='diff-add'> var msg = this._get_msg(msg_type, content, metadata, buffers);</span> <span class='diff-add'> msg.channel = 'shell';</span> <span class='diff-add'> this.ws.send(serialize.serialize(msg));</span> <span class='diff-add'> this.set_callbacks_for_msg(msg.header.msg_id, callbacks);</span> <span class='diff-add'> return msg.header.msg_id;</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype.kernel_info = function (callback) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get kernel info</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function kernel_info</span> <span class='diff-add'> * @param callback {function}</span> <span class='diff-add'> *</span> <span class='diff-add'> * When calling this method, pass a callback function that expects one argument.</span> <span class='diff-add'> * The callback will be passed the complete `kernel_info_reply` message documented</span> <span class='diff-add'> * [here](http://ipython.org/ipython-doc/dev/development/messaging.html#kernel-info)</span> <span class='diff-add'> */</span> <span class='diff-add'> var callbacks;</span> <span class='diff-add'> if (callback) {</span> <span class='diff-add'> callbacks = { shell : { reply : callback } };</span> <span class='diff-add'> }</span> <span class='diff-add'> return this.send_shell_message("kernel_info_request", {}, callbacks);</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype.inspect = function (code, cursor_pos, callback) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get info on an object</span> <span class='diff-add'> *</span> <span class='diff-add'> * When calling this method, pass a callback function that expects one argument.</span> <span class='diff-add'> * The callback will be passed the complete `inspect_reply` message documented</span> <span class='diff-add'> * [here](http://ipython.org/ipython-doc/dev/development/messaging.html#object-information)</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function inspect</span> <span class='diff-add'> * @param code {string}</span> <span class='diff-add'> * @param cursor_pos {integer}</span> <span class='diff-add'> * @param callback {function}</span> <span class='diff-add'> */</span> <span class='diff-add'> var callbacks;</span> <span class='diff-add'> if (callback) {</span> <span class='diff-add'> callbacks = { shell : { reply : callback } };</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> var content = {</span> <span class='diff-add'> code : code,</span> <span class='diff-add'> cursor_pos : cursor_pos,</span> <span class='diff-add'> detail_level : 0</span> <span class='diff-add'> };</span> <span class='diff-add'> return this.send_shell_message("inspect_request", content, callbacks);</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype.execute = function (code, callbacks, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Execute given code into kernel, and pass result to callback.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @async</span> <span class='diff-add'> * @function execute</span> <span class='diff-add'> * @param {string} code</span> <span class='diff-add'> * @param [callbacks] {Object} With the following keys (all optional)</span> <span class='diff-add'> * @param callbacks.shell.reply {function}</span> <span class='diff-add'> * @param callbacks.shell.payload.[payload_name] {function}</span> <span class='diff-add'> * @param callbacks.iopub.output {function}</span> <span class='diff-add'> * @param callbacks.iopub.clear_output {function}</span> <span class='diff-add'> * @param callbacks.input {function}</span> <span class='diff-add'> * @param {object} [options]</span> <span class='diff-add'> * @param [options.silent=false] {Boolean}</span> <span class='diff-add'> * @param [options.user_expressions=empty_dict] {Dict}</span> <span class='diff-add'> * @param [options.allow_stdin=false] {Boolean} true|false</span> <span class='diff-add'> *</span> <span class='diff-add'> * @example</span> <span class='diff-add'> *</span> <span class='diff-add'> * The options object should contain the options for the execute</span> <span class='diff-add'> * call. Its default values are:</span> <span class='diff-add'> *</span> <span class='diff-add'> * options = {</span> <span class='diff-add'> * silent : true,</span> <span class='diff-add'> * user_expressions : {},</span> <span class='diff-add'> * allow_stdin : false</span> <span class='diff-add'> * }</span> <span class='diff-add'> *</span> <span class='diff-add'> * When calling this method pass a callbacks structure of the</span> <span class='diff-add'> * form:</span> <span class='diff-add'> *</span> <span class='diff-add'> * callbacks = {</span> <span class='diff-add'> * shell : {</span> <span class='diff-add'> * reply : execute_reply_callback,</span> <span class='diff-add'> * payload : {</span> <span class='diff-add'> * set_next_input : set_next_input_callback,</span> <span class='diff-add'> * }</span> <span class='diff-add'> * },</span> <span class='diff-add'> * iopub : {</span> <span class='diff-add'> * output : output_callback,</span> <span class='diff-add'> * clear_output : clear_output_callback,</span> <span class='diff-add'> * },</span> <span class='diff-add'> * input : raw_input_callback</span> <span class='diff-add'> * }</span> <span class='diff-add'> *</span> <span class='diff-add'> * Each callback will be passed the entire message as a single</span> <span class='diff-add'> * arugment. Payload handlers will be passed the corresponding</span> <span class='diff-add'> * payload and the execute_reply message.</span> <span class='diff-add'> */</span> <span class='diff-add'> var content = {</span> <span class='diff-add'> code : code,</span> <span class='diff-add'> silent : true,</span> <span class='diff-add'> store_history : false,</span> <span class='diff-add'> user_expressions : {},</span> <span class='diff-add'> allow_stdin : false</span> <span class='diff-add'> };</span> <span class='diff-add'> callbacks = callbacks || {};</span> <span class='diff-add'> if (callbacks.input !== undefined) {</span> <span class='diff-add'> content.allow_stdin = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> $.extend(true, content, options);</span> <span class='diff-add'> this.events.trigger('execution_request.Kernel', {kernel: this, content: content});</span> <span class='diff-add'> return this.send_shell_message("execute_request", content, callbacks);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * When calling this method, pass a function to be called with the</span> <span class='diff-add'> * `complete_reply` message as its only argument when it arrives.</span> <span class='diff-add'> *</span> <span class='diff-add'> * `complete_reply` is documented</span> <span class='diff-add'> * [here](http://ipython.org/ipython-doc/dev/development/messaging.html#complete)</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function complete</span> <span class='diff-add'> * @param code {string}</span> <span class='diff-add'> * @param cursor_pos {integer}</span> <span class='diff-add'> * @param callback {function}</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype.complete = function (code, cursor_pos, callback) {</span> <span class='diff-add'> var callbacks;</span> <span class='diff-add'> if (callback) {</span> <span class='diff-add'> callbacks = { shell : { reply : callback } };</span> <span class='diff-add'> }</span> <span class='diff-add'> var content = {</span> <span class='diff-add'> code : code,</span> <span class='diff-add'> cursor_pos : cursor_pos</span> <span class='diff-add'> };</span> <span class='diff-add'> return this.send_shell_message("complete_request", content, callbacks);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @function send_input_reply</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype.send_input_reply = function (input) {</span> <span class='diff-add'> if (!this.is_connected()) {</span> <span class='diff-add'> throw new Error("kernel is not connected");</span> <span class='diff-add'> }</span> <span class='diff-add'> var content = {</span> <span class='diff-add'> value : input</span> <span class='diff-add'> };</span> <span class='diff-add'> this.events.trigger('input_reply.Kernel', {kernel: this, content: content});</span> <span class='diff-add'> var msg = this._get_msg("input_reply", content);</span> <span class='diff-add'> msg.channel = 'stdin';</span> <span class='diff-add'> this.ws.send(serialize.serialize(msg));</span> <span class='diff-add'> return msg.header.msg_id;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @function register_iopub_handler</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype.register_iopub_handler = function (msg_type, callback) {</span> <span class='diff-add'> this._iopub_handlers[msg_type] = callback;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get the iopub handler for a specific message type.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function get_iopub_handler</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype.get_iopub_handler = function (msg_type) {</span> <span class='diff-add'> return this._iopub_handlers[msg_type];</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get callbacks for a specific message.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function get_callbacks_for_msg</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype.get_callbacks_for_msg = function (msg_id) {</span> <span class='diff-add'> if (msg_id == this.last_msg_id) {</span> <span class='diff-add'> return this.last_msg_callbacks;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return this._msg_callbacks[msg_id];</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Clear callbacks for a specific message.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function clear_callbacks_for_msg</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype.clear_callbacks_for_msg = function (msg_id) {</span> <span class='diff-add'> if (this._msg_callbacks[msg_id] !== undefined ) {</span> <span class='diff-add'> delete this._msg_callbacks[msg_id];</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * @function _finish_shell</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype._finish_shell = function (msg_id) {</span> <span class='diff-add'> var callbacks = this._msg_callbacks[msg_id];</span> <span class='diff-add'> if (callbacks !== undefined) {</span> <span class='diff-add'> callbacks.shell_done = true;</span> <span class='diff-add'> if (callbacks.iopub_done) {</span> <span class='diff-add'> this.clear_callbacks_for_msg(msg_id);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @function _finish_iopub</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype._finish_iopub = function (msg_id) {</span> <span class='diff-add'> var callbacks = this._msg_callbacks[msg_id];</span> <span class='diff-add'> if (callbacks !== undefined) {</span> <span class='diff-add'> callbacks.iopub_done = true;</span> <span class='diff-add'> if (callbacks.shell_done) {</span> <span class='diff-add'> this.clear_callbacks_for_msg(msg_id);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set callbacks for a particular message.</span> <span class='diff-add'> * Callbacks should be a struct of the following form:</span> <span class='diff-add'> * shell : {</span> <span class='diff-add'> * </span> <span class='diff-add'> * }</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function set_callbacks_for_msg</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype.set_callbacks_for_msg = function (msg_id, callbacks) {</span> <span class='diff-add'> this.last_msg_id = msg_id;</span> <span class='diff-add'> if (callbacks) {</span> <span class='diff-add'> // shallow-copy mapping, because we will modify it at the top level</span> <span class='diff-add'> var cbcopy = this._msg_callbacks[msg_id] = this.last_msg_callbacks = {};</span> <span class='diff-add'> cbcopy.shell = callbacks.shell;</span> <span class='diff-add'> cbcopy.iopub = callbacks.iopub;</span> <span class='diff-add'> cbcopy.input = callbacks.input;</span> <span class='diff-add'> cbcopy.shell_done = (!callbacks.shell);</span> <span class='diff-add'> cbcopy.iopub_done = (!callbacks.iopub);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.last_msg_callbacks = {};</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> Kernel.prototype._handle_ws_message = function (e) {</span> <span class='diff-add'> serialize.deserialize(e.data, $.proxy(this._finish_ws_message, this));</span> <span class='diff-add'> };</span> <span class='diff-add'> Kernel.prototype._finish_ws_message = function (msg) {</span> <span class='diff-add'> switch (msg.channel) {</span> <span class='diff-add'> case 'shell':</span> <span class='diff-add'> this._handle_shell_reply(msg);</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'iopub':</span> <span class='diff-add'> this._handle_iopub_message(msg);</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'stdin':</span> <span class='diff-add'> this._handle_input_request(msg);</span> <span class='diff-add'> break;</span> <span class='diff-add'> default:</span> <span class='diff-add'> console.error("unrecognized message channel", msg.channel, msg);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> Kernel.prototype._handle_shell_reply = function (reply) {</span> <span class='diff-add'> this.events.trigger('shell_reply.Kernel', {kernel: this, reply:reply});</span> <span class='diff-add'> var content = reply.content;</span> <span class='diff-add'> var metadata = reply.metadata;</span> <span class='diff-add'> var parent_id = reply.parent_header.msg_id;</span> <span class='diff-add'> var callbacks = this.get_callbacks_for_msg(parent_id);</span> <span class='diff-add'> if (!callbacks || !callbacks.shell) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var shell_callbacks = callbacks.shell;</span> <span class='diff-add'> </span> <span class='diff-add'> // signal that shell callbacks are done</span> <span class='diff-add'> this._finish_shell(parent_id);</span> <span class='diff-add'> </span> <span class='diff-add'> if (shell_callbacks.reply !== undefined) {</span> <span class='diff-add'> shell_callbacks.reply(reply);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (content.payload && shell_callbacks.payload) {</span> <span class='diff-add'> this._handle_payloads(content.payload, shell_callbacks.payload, reply);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @function _handle_payloads</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype._handle_payloads = function (payloads, payload_callbacks, msg) {</span> <span class='diff-add'> var l = payloads.length;</span> <span class='diff-add'> // Payloads are handled by triggering events because we don't want the Kernel</span> <span class='diff-add'> // to depend on the Notebook or Pager classes.</span> <span class='diff-add'> for (var i=0; i<l; i++) {</span> <span class='diff-add'> var payload = payloads[i];</span> <span class='diff-add'> var callback = payload_callbacks[payload.source];</span> <span class='diff-add'> if (callback) {</span> <span class='diff-add'> callback(payload, msg);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @function _handle_status_message</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype._handle_status_message = function (msg) {</span> <span class='diff-add'> var execution_state = msg.content.execution_state;</span> <span class='diff-add'> var parent_id = msg.parent_header.msg_id;</span> <span class='diff-add'> </span> <span class='diff-add'> // dispatch status msg callbacks, if any</span> <span class='diff-add'> var callbacks = this.get_callbacks_for_msg(parent_id);</span> <span class='diff-add'> if (callbacks && callbacks.iopub && callbacks.iopub.status) {</span> <span class='diff-add'> try {</span> <span class='diff-add'> callbacks.iopub.status(msg);</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> console.log("Exception in status msg handler", e, e.stack);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> if (execution_state === 'busy') {</span> <span class='diff-add'> this.events.trigger('kernel_busy.Kernel', {kernel: this});</span> <span class='diff-add'> } else if (execution_state === 'idle') {</span> <span class='diff-add'> // signal that iopub callbacks are (probably) done</span> <span class='diff-add'> // async output may still arrive,</span> <span class='diff-add'> // but only for the most recent request</span> <span class='diff-add'> this._finish_iopub(parent_id);</span> <span class='diff-add'> </span> <span class='diff-add'> // trigger status_idle event</span> <span class='diff-add'> this.events.trigger('kernel_idle.Kernel', {kernel: this});</span> <span class='diff-add'> } else if (execution_state === 'starting') {</span> <span class='diff-add'> this.events.trigger('kernel_starting.Kernel', {kernel: this});</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.kernel_info(function (reply) {</span> <span class='diff-add'> that.info_reply = reply.content;</span> <span class='diff-add'> that.events.trigger('kernel_ready.Kernel', {kernel: that});</span> <span class='diff-add'> });</span> <span class='diff-add'> } else if (execution_state === 'restarting') {</span> <span class='diff-add'> // autorestarting is distinct from restarting,</span> <span class='diff-add'> // in that it means the kernel died and the server is restarting it.</span> <span class='diff-add'> // kernel_restarting sets the notification widget,</span> <span class='diff-add'> // autorestart shows the more prominent dialog.</span> <span class='diff-add'> this._autorestart_attempt = this._autorestart_attempt + 1;</span> <span class='diff-add'> this.events.trigger('kernel_restarting.Kernel', {kernel: this});</span> <span class='diff-add'> this.events.trigger('kernel_autorestarting.Kernel', {kernel: this, attempt: this._autorestart_attempt});</span> <span class='diff-add'> } else if (execution_state === 'dead') {</span> <span class='diff-add'> this.events.trigger('kernel_dead.Kernel', {kernel: this});</span> <span class='diff-add'> this._kernel_dead();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle clear_output message</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function _handle_clear_output</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype._handle_clear_output = function (msg) {</span> <span class='diff-add'> var callbacks = this.get_callbacks_for_msg(msg.parent_header.msg_id);</span> <span class='diff-add'> if (!callbacks || !callbacks.iopub) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var callback = callbacks.iopub.clear_output;</span> <span class='diff-add'> if (callback) {</span> <span class='diff-add'> callback(msg);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * handle an output message (execute_result, display_data, etc.)</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function _handle_output_message</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype._handle_output_message = function (msg) {</span> <span class='diff-add'> var callbacks = this.get_callbacks_for_msg(msg.parent_header.msg_id);</span> <span class='diff-add'> if (!callbacks || !callbacks.iopub) {</span> <span class='diff-add'> // The message came from another client. Let the UI decide what to</span> <span class='diff-add'> // do with it.</span> <span class='diff-add'> this.events.trigger('received_unsolicited_message.Kernel', msg);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var callback = callbacks.iopub.output;</span> <span class='diff-add'> if (callback) {</span> <span class='diff-add'> callback(msg);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle an input message (execute_input).</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function _handle_input message</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype._handle_input_message = function (msg) {</span> <span class='diff-add'> var callbacks = this.get_callbacks_for_msg(msg.parent_header.msg_id);</span> <span class='diff-add'> if (!callbacks) {</span> <span class='diff-add'> // The message came from another client. Let the UI decide what to</span> <span class='diff-add'> // do with it.</span> <span class='diff-add'> this.events.trigger('received_unsolicited_message.Kernel', msg);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Dispatch IOPub messages to respective handlers. Each message</span> <span class='diff-add'> * type should have a handler.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function _handle_iopub_message</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype._handle_iopub_message = function (msg) {</span> <span class='diff-add'> var handler = this.get_iopub_handler(msg.header.msg_type);</span> <span class='diff-add'> if (handler !== undefined) {</span> <span class='diff-add'> handler(msg);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @function _handle_input_request</span> <span class='diff-add'> */</span> <span class='diff-add'> Kernel.prototype._handle_input_request = function (request) {</span> <span class='diff-add'> var header = request.header;</span> <span class='diff-add'> var content = request.content;</span> <span class='diff-add'> var metadata = request.metadata;</span> <span class='diff-add'> var msg_type = header.msg_type;</span> <span class='diff-add'> if (msg_type !== 'input_request') {</span> <span class='diff-add'> console.log("Invalid input request!", request);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var callbacks = this.get_callbacks_for_msg(request.parent_header.msg_id);</span> <span class='diff-add'> if (callbacks) {</span> <span class='diff-add'> if (callbacks.input) {</span> <span class='diff-add'> callbacks.input(request);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatability.</span> <span class='diff-add'> IPython.Kernel = Kernel;</span> <span class='diff-add'> return {'Kernel': Kernel};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/kernelselector.js b/ipynb/Array-feature-overlap-05_files/kernelselector.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..e25ed2b</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/kernelselector.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'base/js/dialog',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'>], function($, IPython, dialog, utils) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> </span> <span class='diff-add'> var KernelSelector = function(selector, notebook) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.selector = selector;</span> <span class='diff-add'> this.notebook = notebook;</span> <span class='diff-add'> this.notebook.set_kernelselector(this);</span> <span class='diff-add'> this.events = notebook.events;</span> <span class='diff-add'> this.current_selection = null;</span> <span class='diff-add'> this.kernelspecs = {};</span> <span class='diff-add'> if (this.selector !== undefined) {</span> <span class='diff-add'> this.element = $(selector);</span> <span class='diff-add'> this.request_kernelspecs();</span> <span class='diff-add'> }</span> <span class='diff-add'> this.bind_events();</span> <span class='diff-add'> // Make the object globally available for user convenience & inspection</span> <span class='diff-add'> IPython.kernelselector = this;</span> <span class='diff-add'> this._finish_load = null;</span> <span class='diff-add'> this._loaded = false;</span> <span class='diff-add'> this.loaded = new Promise(function(resolve) {</span> <span class='diff-add'> that._finish_load = resolve;</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> Object.seal(this);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> KernelSelector.prototype.request_kernelspecs = function() {</span> <span class='diff-add'> var url = utils.url_join_encode(this.notebook.base_url, 'api/kernelspecs');</span> <span class='diff-add'> utils.promising_ajax(url).then($.proxy(this._got_kernelspecs, this));</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var _sorted_names = function(kernelspecs) {</span> <span class='diff-add'> // sort kernel names</span> <span class='diff-add'> return Object.keys(kernelspecs).sort(function (a, b) {</span> <span class='diff-add'> // sort by display_name</span> <span class='diff-add'> var da = kernelspecs[a].spec.display_name;</span> <span class='diff-add'> var db = kernelspecs[b].spec.display_name;</span> <span class='diff-add'> if (da === db) {</span> <span class='diff-add'> return 0;</span> <span class='diff-add'> } else if (da > db) {</span> <span class='diff-add'> return 1;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return -1;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> KernelSelector.prototype._got_kernelspecs = function(data) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.kernelspecs = data.kernelspecs;</span> <span class='diff-add'> var change_kernel_submenu = $("#menu-change-kernel-submenu");</span> <span class='diff-add'> var new_notebook_submenu = $("#menu-new-notebook-submenu");</span> <span class='diff-add'> var keys = _sorted_names(data.kernelspecs);</span> <span class='diff-add'> </span> <span class='diff-add'> keys.map(function (key) {</span> <span class='diff-add'> // Create the Kernel > Change kernel submenu</span> <span class='diff-add'> var ks = data.kernelspecs[key];</span> <span class='diff-add'> change_kernel_submenu.append(</span> <span class='diff-add'> $("<li>").attr("id", "kernel-submenu-"+ks.name).append(</span> <span class='diff-add'> $('<a>')</span> <span class='diff-add'> .attr('href', '#')</span> <span class='diff-add'> .click( function () {</span> <span class='diff-add'> that.set_kernel(ks.name);</span> <span class='diff-add'> })</span> <span class='diff-add'> .text(ks.spec.display_name)</span> <span class='diff-add'> )</span> <span class='diff-add'> );</span> <span class='diff-add'> // Create the File > New Notebook submenu</span> <span class='diff-add'> new_notebook_submenu.append(</span> <span class='diff-add'> $("<li>").attr("id", "new-notebook-submenu-"+ks.name).append(</span> <span class='diff-add'> $('<a>')</span> <span class='diff-add'> .attr('href', '#')</span> <span class='diff-add'> .click( function () {</span> <span class='diff-add'> that.new_notebook(ks.name);</span> <span class='diff-add'> })</span> <span class='diff-add'> .text(ks.spec.display_name)</span> <span class='diff-add'> )</span> <span class='diff-add'> );</span> <span class='diff-add'> });</span> <span class='diff-add'> // trigger loaded promise</span> <span class='diff-add'> this._loaded = true;</span> <span class='diff-add'> this._finish_load();</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> KernelSelector.prototype._spec_changed = function (event, ks) {</span> <span class='diff-add'> /** event handler for spec_changed */</span> <span class='diff-add'> </span> <span class='diff-add'> // update selection</span> <span class='diff-add'> this.current_selection = ks.name;</span> <span class='diff-add'> </span> <span class='diff-add'> // put the current kernel at the top of File > New Notebook</span> <span class='diff-add'> var cur_kernel_entry = $("#new-notebook-submenu-" + ks.name);</span> <span class='diff-add'> var parent = cur_kernel_entry.parent();</span> <span class='diff-add'> // do something only if there is more than one kernel</span> <span class='diff-add'> if (parent.children().length > 1) {</span> <span class='diff-add'> // first, sort back the submenu</span> <span class='diff-add'> parent.append(</span> <span class='diff-add'> parent.children("li[class!='divider']").sort(</span> <span class='diff-add'> function (a,b) {</span> <span class='diff-add'> var da = $("a",a).text();</span> <span class='diff-add'> var db = $("a",b).text();</span> <span class='diff-add'> if (da === db) {</span> <span class='diff-add'> return 0;</span> <span class='diff-add'> } else if (da > db) {</span> <span class='diff-add'> return 1;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return -1;</span> <span class='diff-add'> }}));</span> <span class='diff-add'> // then, if there is no divider yet, add one</span> <span class='diff-add'> if (!parent.children("li[class='divider']").length) {</span> <span class='diff-add'> parent.prepend($("<li>").attr("class","divider"));</span> <span class='diff-add'> } </span> <span class='diff-add'> // finally, put the current kernel at the top</span> <span class='diff-add'> parent.prepend(cur_kernel_entry);</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> // load logo</span> <span class='diff-add'> var logo_img = this.element.find("img.current_kernel_logo");</span> <span class='diff-add'> $("#kernel_indicator").find('.kernel_indicator_name').text(ks.spec.display_name);</span> <span class='diff-add'> if (ks.resources['logo-64x64']) {</span> <span class='diff-add'> logo_img.attr("src", ks.resources['logo-64x64']);</span> <span class='diff-add'> logo_img.show();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> logo_img.hide();</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> // load kernel css</span> <span class='diff-add'> var css_url = ks.resources['kernel.css'];</span> <span class='diff-add'> if (css_url) {</span> <span class='diff-add'> $('#kernel-css').attr('href', css_url);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> $('#kernel-css').attr('href', '');</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> // load kernel js</span> <span class='diff-add'> if (ks.resources['kernel.js']) {</span> <span class='diff-add'> require([ks.resources['kernel.js']],</span> <span class='diff-add'> function (kernel_mod) {</span> <span class='diff-add'> if (kernel_mod && kernel_mod.onload) {</span> <span class='diff-add'> kernel_mod.onload();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> console.warn("Kernel " + ks.name + " has a kernel.js file that does not contain "+</span> <span class='diff-add'> "any asynchronous module definition. This is undefined behavior "+</span> <span class='diff-add'> "and not recommended.");</span> <span class='diff-add'> }</span> <span class='diff-add'> }, function (err) {</span> <span class='diff-add'> console.warn("Failed to load kernel.js from ", ks.resources['kernel.js'], err);</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> KernelSelector.prototype.set_kernel = function (selected) {</span> <span class='diff-add'> /** set the kernel by name, ensuring kernelspecs have been loaded, first </span> <span class='diff-add'> </span> <span class='diff-add'> kernel can be just a kernel name, or a notebook kernelspec metadata</span> <span class='diff-add'> (name, language, display_name).</span> <span class='diff-add'> */</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> if (typeof selected === 'string') {</span> <span class='diff-add'> selected = {</span> <span class='diff-add'> name: selected</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this._loaded) {</span> <span class='diff-add'> this._set_kernel(selected);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return this.loaded.then(function () {</span> <span class='diff-add'> that._set_kernel(selected);</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> KernelSelector.prototype._set_kernel = function (selected) {</span> <span class='diff-add'> /** Actually set the kernel (kernelspecs have been loaded) */</span> <span class='diff-add'> if (selected.name === this.current_selection) {</span> <span class='diff-add'> // only trigger event if value changed</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var kernelspecs = this.kernelspecs;</span> <span class='diff-add'> var ks = kernelspecs[selected.name];</span> <span class='diff-add'> if (ks === undefined) {</span> <span class='diff-add'> var available = _sorted_names(kernelspecs);</span> <span class='diff-add'> var matches = [];</span> <span class='diff-add'> if (selected.language && selected.language.length > 0) {</span> <span class='diff-add'> available.map(function (name) {</span> <span class='diff-add'> if (kernelspecs[name].spec.language.toLowerCase() === selected.language.toLowerCase()) {</span> <span class='diff-add'> matches.push(name);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> if (matches.length === 1) {</span> <span class='diff-add'> ks = kernelspecs[matches[0]];</span> <span class='diff-add'> console.log("No exact match found for " + selected.name +</span> <span class='diff-add'> ", using only kernel that matches language=" + selected.language, ks);</span> <span class='diff-add'> this.events.trigger("spec_match_found.Kernel", {</span> <span class='diff-add'> selected: selected,</span> <span class='diff-add'> found: ks,</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> // if still undefined, trigger failure event</span> <span class='diff-add'> if (ks === undefined) {</span> <span class='diff-add'> this.events.trigger("spec_not_found.Kernel", {</span> <span class='diff-add'> selected: selected,</span> <span class='diff-add'> matches: matches,</span> <span class='diff-add'> available: available,</span> <span class='diff-add'> });</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.notebook._session_starting &&</span> <span class='diff-add'> this.notebook.session.kernel.name !== ks.name) {</span> <span class='diff-add'> console.error("Cannot change kernel while waiting for pending session start.");</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.current_selection = ks.name;</span> <span class='diff-add'> this.events.trigger('spec_changed.Kernel', ks);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> KernelSelector.prototype._spec_not_found = function (event, data) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var select = $("<select>").addClass('form-control');</span> <span class='diff-add'> console.warn("Kernelspec not found:", data);</span> <span class='diff-add'> var names;</span> <span class='diff-add'> if (data.matches.length > 1) {</span> <span class='diff-add'> names = data.matches;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> names = data.available;</span> <span class='diff-add'> }</span> <span class='diff-add'> names.map(function (name) {</span> <span class='diff-add'> var ks = that.kernelspecs[name];</span> <span class='diff-add'> select.append(</span> <span class='diff-add'> $('<option/>').attr('value', ks.name).text(ks.spec.display_name || ks.name)</span> <span class='diff-add'> );</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> var body = $("<form>").addClass("form-inline").append(</span> <span class='diff-add'> $("<span>").text(</span> <span class='diff-add'> "I couldn't find a kernel matching " + (data.selected.display_name || data.selected.name) + "." +</span> <span class='diff-add'> " Please select a kernel:"</span> <span class='diff-add'> )</span> <span class='diff-add'> ).append(select);</span> <span class='diff-add'> </span> <span class='diff-add'> dialog.modal({</span> <span class='diff-add'> title : 'Kernel not found',</span> <span class='diff-add'> body : body,</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> 'Continue without kernel' : {</span> <span class='diff-add'> class : 'btn-danger',</span> <span class='diff-add'> click : function () {</span> <span class='diff-add'> that.events.trigger('no_kernel.Kernel');</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> OK : {</span> <span class='diff-add'> class : 'btn-primary',</span> <span class='diff-add'> click : function () {</span> <span class='diff-add'> that.set_kernel(select.val());</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> KernelSelector.prototype.new_notebook = function (kernel_name) {</span> <span class='diff-add'> </span> <span class='diff-add'> var w = window.open(undefined, IPython._target);</span> <span class='diff-add'> // Create a new notebook in the same path as the current</span> <span class='diff-add'> // notebook's path.</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var parent = utils.url_path_split(that.notebook.notebook_path)[0];</span> <span class='diff-add'> that.notebook.contents.new_untitled(parent, {type: "notebook"}).then(</span> <span class='diff-add'> function (data) {</span> <span class='diff-add'> var url = utils.url_join_encode(</span> <span class='diff-add'> that.notebook.base_url, 'notebooks', data.path</span> <span class='diff-add'> );</span> <span class='diff-add'> url += "?kernel_name=" + kernel_name;</span> <span class='diff-add'> w.location = url;</span> <span class='diff-add'> },</span> <span class='diff-add'> function(error) {</span> <span class='diff-add'> w.close();</span> <span class='diff-add'> dialog.modal({</span> <span class='diff-add'> title : 'Creating Notebook Failed',</span> <span class='diff-add'> body : "The error was: " + error.message,</span> <span class='diff-add'> buttons : {'OK' : {'class' : 'btn-primary'}}</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> KernelSelector.prototype.lock_switch = function() {</span> <span class='diff-add'> // should set a flag and display warning+reload if user want to</span> <span class='diff-add'> // re-change kernel. As UI discussion never finish</span> <span class='diff-add'> // making that a separate PR.</span> <span class='diff-add'> console.warn('switching kernel is not guaranteed to work !');</span> <span class='diff-add'> };</span> <span class='diff-add'> KernelSelector.prototype.bind_events = function() {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.events.on('spec_changed.Kernel', $.proxy(this._spec_changed, this));</span> <span class='diff-add'> this.events.on('spec_not_found.Kernel', $.proxy(this._spec_not_found, this));</span> <span class='diff-add'> this.events.on('kernel_created.Session', function (event, data) {</span> <span class='diff-add'> that.set_kernel(data.kernel.name);</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> var logo_img = this.element.find("img.current_kernel_logo");</span> <span class='diff-add'> logo_img.on("load", function() {</span> <span class='diff-add'> logo_img.show();</span> <span class='diff-add'> });</span> <span class='diff-add'> logo_img.on("error", function() {</span> <span class='diff-add'> logo_img.hide();</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> return {'KernelSelector': KernelSelector};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/keyboard.js b/ipynb/Array-feature-overlap-05_files/keyboard.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..474b240</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/keyboard.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>/**</span> <span class='diff-add'> *</span> <span class='diff-add'> *</span> <span class='diff-add'> * @module keyboard</span> <span class='diff-add'> * @namespace keyboard</span> <span class='diff-add'> * @class ShortcutManager</span> <span class='diff-add'> */</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> 'underscore',</span> <span class='diff-add'>], function(IPython, $, utils, _) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Setup global keycodes and inverse keycodes.</span> <span class='diff-add'> * </span> <span class='diff-add'> * See http://unixpapa.com/js/key.html for a complete description. The short of</span> <span class='diff-add'> * it is that there are different keycode sets. Firefox uses the "Mozilla keycodes"</span> <span class='diff-add'> * and Webkit/IE use the "IE keycodes". These keycode sets are mostly the same</span> <span class='diff-add'> * but have minor differences.</span> <span class='diff-add'> **/</span> <span class='diff-add'> // These apply to Firefox, (Webkit and IE)</span> <span class='diff-add'> // This does work **only** on US keyboard.</span> <span class='diff-add'> var _keycodes = {</span> <span class='diff-add'> 'a': 65, 'b': 66, 'c': 67, 'd': 68, 'e': 69, 'f': 70, 'g': 71, 'h': 72, 'i': 73,</span> <span class='diff-add'> 'j': 74, 'k': 75, 'l': 76, 'm': 77, 'n': 78, 'o': 79, 'p': 80, 'q': 81, 'r': 82,</span> <span class='diff-add'> 's': 83, 't': 84, 'u': 85, 'v': 86, 'w': 87, 'x': 88, 'y': 89, 'z': 90,</span> <span class='diff-add'> '1 !': 49, '2 @': 50, '3 #': 51, '4 $': 52, '5 %': 53, '6 ^': 54,</span> <span class='diff-add'> '7 &': 55, '8 *': 56, '9 (': 57, '0 )': 48, </span> <span class='diff-add'> '[ {': 219, '] }': 221, '` ~': 192, ', <': 188, '. >': 190, '/ ?': 191,</span> <span class='diff-add'> '\\ |': 220, '\' "': 222,</span> <span class='diff-add'> 'numpad0': 96, 'numpad1': 97, 'numpad2': 98, 'numpad3': 99, 'numpad4': 100,</span> <span class='diff-add'> 'numpad5': 101, 'numpad6': 102, 'numpad7': 103, 'numpad8': 104, 'numpad9': 105,</span> <span class='diff-add'> 'multiply': 106, 'add': 107, 'subtract': 109, 'decimal': 110, 'divide': 111,</span> <span class='diff-add'> 'f1': 112, 'f2': 113, 'f3': 114, 'f4': 115, 'f5': 116, 'f6': 117, 'f7': 118,</span> <span class='diff-add'> 'f8': 119, 'f9': 120, 'f11': 122, 'f12': 123, 'f13': 124, 'f14': 125, 'f15': 126,</span> <span class='diff-add'> 'backspace': 8, 'tab': 9, 'enter': 13, 'shift': 16, 'ctrl': 17, 'alt': 18,</span> <span class='diff-add'> 'meta': 91, 'capslock': 20, 'esc': 27, 'space': 32, 'pageup': 33, 'pagedown': 34,</span> <span class='diff-add'> 'end': 35, 'home': 36, 'left': 37, 'up': 38, 'right': 39, 'down': 40,</span> <span class='diff-add'> 'insert': 45, 'delete': 46, 'numlock': 144,</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> // These apply to Firefox and Opera</span> <span class='diff-add'> var _mozilla_keycodes = {</span> <span class='diff-add'> '; :': 59, '= +': 61, '- _': 173, 'meta': 224</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> // This apply to Webkit and IE</span> <span class='diff-add'> var _ie_keycodes = {</span> <span class='diff-add'> '; :': 186, '= +': 187, '- _': 189</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var browser = utils.browser[0];</span> <span class='diff-add'> var platform = utils.platform;</span> <span class='diff-add'> </span> <span class='diff-add'> if (browser === 'Firefox' || browser === 'Opera' || browser === 'Netscape') {</span> <span class='diff-add'> $.extend(_keycodes, _mozilla_keycodes);</span> <span class='diff-add'> } else if (browser === 'Safari' || browser === 'Chrome' || browser === 'MSIE') {</span> <span class='diff-add'> $.extend(_keycodes, _ie_keycodes);</span> <span class='diff-add'> }</span> <span class='diff-add'> var keycodes = {};</span> <span class='diff-add'> var inv_keycodes = {};</span> <span class='diff-add'> for (var name in _keycodes) {</span> <span class='diff-add'> var names = name.split(' ');</span> <span class='diff-add'> if (names.length === 1) {</span> <span class='diff-add'> var n = names[0];</span> <span class='diff-add'> keycodes[n] = _keycodes[n];</span> <span class='diff-add'> inv_keycodes[_keycodes[n]] = n;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var primary = names[0];</span> <span class='diff-add'> var secondary = names[1];</span> <span class='diff-add'> keycodes[primary] = _keycodes[name];</span> <span class='diff-add'> keycodes[secondary] = _keycodes[name];</span> <span class='diff-add'> inv_keycodes[_keycodes[name]] = primary;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> var normalize_key = function (key) {</span> <span class='diff-add'> return inv_keycodes[keycodes[key]];</span> <span class='diff-add'> };</span> <span class='diff-add'> var normalize_shortcut = function (shortcut) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @function _normalize_shortcut</span> <span class='diff-add'> * @private</span> <span class='diff-add'> * return a dict containing the normalized shortcut and the number of time it should be pressed:</span> <span class='diff-add'> *</span> <span class='diff-add'> * Put a shortcut into normalized form:</span> <span class='diff-add'> * 1. Make lowercase</span> <span class='diff-add'> * 2. Replace cmd by meta</span> <span class='diff-add'> * 3. Sort '-' separated modifiers into the order alt-ctrl-meta-shift</span> <span class='diff-add'> * 4. Normalize keys</span> <span class='diff-add'> **/</span> <span class='diff-add'> if (platform === 'MacOS') {</span> <span class='diff-add'> shortcut = shortcut.toLowerCase().replace('cmdtrl-', 'cmd-');</span> <span class='diff-add'> } else {</span> <span class='diff-add'> shortcut = shortcut.toLowerCase().replace('cmdtrl-', 'ctrl-');</span> <span class='diff-add'> }</span> <span class='diff-add'> shortcut = shortcut.toLowerCase().replace('cmd', 'meta');</span> <span class='diff-add'> shortcut = shortcut.replace(/-$/, '_'); // catch shortcuts using '-' key</span> <span class='diff-add'> shortcut = shortcut.replace(/,$/, 'comma'); // catch shortcuts using '-' key</span> <span class='diff-add'> if(shortcut.indexOf(',') !== -1){</span> <span class='diff-add'> var sht = shortcut.split(',');</span> <span class='diff-add'> sht = _.map(sht, normalize_shortcut);</span> <span class='diff-add'> return shortcut;</span> <span class='diff-add'> }</span> <span class='diff-add'> shortcut = shortcut.replace(/comma/g, ','); // catch shortcuts using '-' key</span> <span class='diff-add'> var values = shortcut.split("-");</span> <span class='diff-add'> if (values.length === 1) {</span> <span class='diff-add'> return normalize_key(values[0]);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var modifiers = values.slice(0,-1);</span> <span class='diff-add'> var key = normalize_key(values[values.length-1]);</span> <span class='diff-add'> modifiers.sort();</span> <span class='diff-add'> return modifiers.join('-') + '-' + key;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var shortcut_to_event = function (shortcut, type) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Convert a shortcut (shift-r) to a jQuery Event object</span> <span class='diff-add'> **/</span> <span class='diff-add'> type = type || 'keydown';</span> <span class='diff-add'> shortcut = normalize_shortcut(shortcut);</span> <span class='diff-add'> shortcut = shortcut.replace(/-$/, '_'); // catch shortcuts using '-' key</span> <span class='diff-add'> var values = shortcut.split("-");</span> <span class='diff-add'> var modifiers = values.slice(0,-1);</span> <span class='diff-add'> var key = values[values.length-1];</span> <span class='diff-add'> var opts = {which: keycodes[key]};</span> <span class='diff-add'> if (modifiers.indexOf('alt') !== -1) {opts.altKey = true;}</span> <span class='diff-add'> if (modifiers.indexOf('ctrl') !== -1) {opts.ctrlKey = true;}</span> <span class='diff-add'> if (modifiers.indexOf('meta') !== -1) {opts.metaKey = true;}</span> <span class='diff-add'> if (modifiers.indexOf('shift') !== -1) {opts.shiftKey = true;}</span> <span class='diff-add'> return $.Event(type, opts);</span> <span class='diff-add'> };</span> <span class='diff-add'> var only_modifier_event = function(event){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Return `true` if the event only contains modifiers keys.</span> <span class='diff-add'> * false otherwise</span> <span class='diff-add'> **/</span> <span class='diff-add'> var key = inv_keycodes[event.which];</span> <span class='diff-add'> return ((event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) && </span> <span class='diff-add'> (key === 'alt'|| key === 'ctrl'|| key === 'meta'|| key === 'shift'));</span> <span class='diff-add'> };</span> <span class='diff-add'> var event_to_shortcut = function (event) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Convert a jQuery Event object to a normalized shortcut string (shift-r)</span> <span class='diff-add'> **/</span> <span class='diff-add'> var shortcut = '';</span> <span class='diff-add'> var key = inv_keycodes[event.which];</span> <span class='diff-add'> if (event.altKey && key !== 'alt') {shortcut += 'alt-';}</span> <span class='diff-add'> if (event.ctrlKey && key !== 'ctrl') {shortcut += 'ctrl-';}</span> <span class='diff-add'> if (event.metaKey && key !== 'meta') {shortcut += 'meta-';}</span> <span class='diff-add'> if (event.shiftKey && key !== 'shift') {shortcut += 'shift-';}</span> <span class='diff-add'> shortcut += key;</span> <span class='diff-add'> return shortcut;</span> <span class='diff-add'> };</span> <span class='diff-add'> // Shortcut manager class</span> <span class='diff-add'> var ShortcutManager = function (delay, events, actions, env) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * A class to deal with keyboard event and shortcut</span> <span class='diff-add'> *</span> <span class='diff-add'> * @class ShortcutManager</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> */</span> <span class='diff-add'> this._shortcuts = {};</span> <span class='diff-add'> this.delay = delay || 800; // delay in milliseconds</span> <span class='diff-add'> this.events = events;</span> <span class='diff-add'> this.actions = actions;</span> <span class='diff-add'> this.actions.extend_env(env);</span> <span class='diff-add'> this._queue = [];</span> <span class='diff-add'> this._cleartimeout = null;</span> <span class='diff-add'> Object.seal(this);</span> <span class='diff-add'> };</span> <span class='diff-add'> ShortcutManager.prototype.clearsoon = function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Clear the pending shortcut soon, and cancel previous clearing</span> <span class='diff-add'> * that might be registered.</span> <span class='diff-add'> **/ </span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> clearTimeout(this._cleartimeout);</span> <span class='diff-add'> this._cleartimeout = setTimeout(function(){that.clearqueue();}, this.delay);</span> <span class='diff-add'> };</span> <span class='diff-add'> ShortcutManager.prototype.clearqueue = function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * clear the pending shortcut sequence now. </span> <span class='diff-add'> **/</span> <span class='diff-add'> this._queue = [];</span> <span class='diff-add'> clearTimeout(this._cleartimeout);</span> <span class='diff-add'> };</span> <span class='diff-add'> var flatten_shorttree = function(tree){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Flatten a tree of shortcut sequences. </span> <span class='diff-add'> * use full to iterate over all the key/values of available shortcuts.</span> <span class='diff-add'> **/</span> <span class='diff-add'> var dct = {};</span> <span class='diff-add'> for(var key in tree){</span> <span class='diff-add'> var value = tree[key];</span> <span class='diff-add'> if(typeof(value) === 'string'){</span> <span class='diff-add'> dct[key] = value;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var ftree=flatten_shorttree(value);</span> <span class='diff-add'> for(var subkey in ftree){</span> <span class='diff-add'> dct[key+','+subkey] = ftree[subkey];</span> <span class='diff-add'> }</span> <span class='diff-add'> } </span> <span class='diff-add'> }</span> <span class='diff-add'> return dct;</span> <span class='diff-add'> };</span> <span class='diff-add'> ShortcutManager.prototype.help = function () {</span> <span class='diff-add'> var help = [];</span> <span class='diff-add'> var ftree = flatten_shorttree(this._shortcuts);</span> <span class='diff-add'> for (var shortcut in ftree) {</span> <span class='diff-add'> var action = this.actions.get(ftree[shortcut]);</span> <span class='diff-add'> var help_string = action.help||'== no help ==';</span> <span class='diff-add'> var help_index = action.help_index;</span> <span class='diff-add'> if (help_string) {</span> <span class='diff-add'> var shortstring = (action.shortstring||shortcut);</span> <span class='diff-add'> help.push({</span> <span class='diff-add'> shortcut: shortstring,</span> <span class='diff-add'> help: help_string,</span> <span class='diff-add'> help_index: help_index}</span> <span class='diff-add'> );</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> help.sort(function (a, b) {</span> <span class='diff-add'> if (a.help_index > b.help_index){</span> <span class='diff-add'> return 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (a.help_index < b.help_index){</span> <span class='diff-add'> return -1;</span> <span class='diff-add'> }</span> <span class='diff-add'> return 0;</span> <span class='diff-add'> });</span> <span class='diff-add'> return help;</span> <span class='diff-add'> };</span> <span class='diff-add'> ShortcutManager.prototype.clear_shortcuts = function () {</span> <span class='diff-add'> this._shortcuts = {};</span> <span class='diff-add'> };</span> <span class='diff-add'> ShortcutManager.prototype.get_shortcut = function (shortcut){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * return a node of the shortcut tree which an action name (string) if leaf,</span> <span class='diff-add'> * and an object with `object.subtree===true`</span> <span class='diff-add'> **/</span> <span class='diff-add'> if(typeof(shortcut) === 'string'){</span> <span class='diff-add'> shortcut = shortcut.split(',');</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> return this._get_leaf(shortcut, this._shortcuts);</span> <span class='diff-add'> };</span> <span class='diff-add'> ShortcutManager.prototype._get_leaf = function(shortcut_array, tree){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @private</span> <span class='diff-add'> * find a leaf/node in a subtree of the keyboard shortcut</span> <span class='diff-add'> *</span> <span class='diff-add'> **/</span> <span class='diff-add'> if(shortcut_array.length === 1){</span> <span class='diff-add'> return tree[shortcut_array[0]];</span> <span class='diff-add'> } else if( typeof(tree[shortcut_array[0]]) !== 'string'){</span> <span class='diff-add'> return this._get_leaf(shortcut_array.slice(1), tree[shortcut_array[0]]);</span> <span class='diff-add'> }</span> <span class='diff-add'> return null;</span> <span class='diff-add'> };</span> <span class='diff-add'> ShortcutManager.prototype.set_shortcut = function( shortcut, action_name){</span> <span class='diff-add'> if( typeof(action_name) !== 'string'){ throw('action is not a string', action_name);}</span> <span class='diff-add'> if( typeof(shortcut) === 'string'){</span> <span class='diff-add'> shortcut = shortcut.split(',');</span> <span class='diff-add'> }</span> <span class='diff-add'> return this._set_leaf(shortcut, action_name, this._shortcuts);</span> <span class='diff-add'> };</span> <span class='diff-add'> ShortcutManager.prototype._is_leaf = function(shortcut_array, tree){</span> <span class='diff-add'> if(shortcut_array.length === 1){</span> <span class='diff-add'> return(typeof(tree[shortcut_array[0]]) === 'string');</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var subtree = tree[shortcut_array[0]];</span> <span class='diff-add'> return this._is_leaf(shortcut_array.slice(1), subtree );</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> ShortcutManager.prototype._remove_leaf = function(shortcut_array, tree, allow_node){</span> <span class='diff-add'> if(shortcut_array.length === 1){</span> <span class='diff-add'> var current_node = tree[shortcut_array[0]];</span> <span class='diff-add'> if(typeof(current_node) === 'string'){</span> <span class='diff-add'> delete tree[shortcut_array[0]];</span> <span class='diff-add'> } else {</span> <span class='diff-add'> throw('try to delete non-leaf');</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this._remove_leaf(shortcut_array.slice(1), tree[shortcut_array[0]], allow_node);</span> <span class='diff-add'> if(_.keys(tree[shortcut_array[0]]).length === 0){</span> <span class='diff-add'> delete tree[shortcut_array[0]];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> ShortcutManager.prototype._set_leaf = function(shortcut_array, action_name, tree){</span> <span class='diff-add'> var current_node = tree[shortcut_array[0]];</span> <span class='diff-add'> if(shortcut_array.length === 1){</span> <span class='diff-add'> if(current_node !== undefined && typeof(current_node) !== 'string'){</span> <span class='diff-add'> console.warn('[warning], you are overriting a long shortcut with a shorter one');</span> <span class='diff-add'> }</span> <span class='diff-add'> tree[shortcut_array[0]] = action_name;</span> <span class='diff-add'> return true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> if(typeof(current_node) === 'string'){</span> <span class='diff-add'> console.warn('you are trying to set a shortcut that will be shadowed'+</span> <span class='diff-add'> 'by a more specific one. Aborting for :', action_name, 'the follwing '+</span> <span class='diff-add'> 'will take precedence', current_node);</span> <span class='diff-add'> return false;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> tree[shortcut_array[0]] = tree[shortcut_array[0]]||{};</span> <span class='diff-add'> }</span> <span class='diff-add'> this._set_leaf(shortcut_array.slice(1), action_name, tree[shortcut_array[0]]);</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> ShortcutManager.prototype.add_shortcut = function (shortcut, data, suppress_help_update) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Add a action to be handled by shortcut manager. </span> <span class='diff-add'> * </span> <span class='diff-add'> * - `shortcut` should be a `Shortcut Sequence` of the for `Ctrl-Alt-C,Meta-X`...</span> <span class='diff-add'> * - `data` could be an `action name`, an `action` or a `function`.</span> <span class='diff-add'> * if a `function` is passed it will be converted to an anonymous `action`. </span> <span class='diff-add'> *</span> <span class='diff-add'> **/</span> <span class='diff-add'> var action_name = this.actions.get_name(data);</span> <span class='diff-add'> if (! action_name){</span> <span class='diff-add'> throw('does nto know how to deal with ', data);</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> shortcut = normalize_shortcut(shortcut);</span> <span class='diff-add'> this.set_shortcut(shortcut, action_name);</span> <span class='diff-add'> if (!suppress_help_update) {</span> <span class='diff-add'> // update the keyboard shortcuts notebook help</span> <span class='diff-add'> this.events.trigger('rebuild.QuickHelp');</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> ShortcutManager.prototype.add_shortcuts = function (data) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Convenient methods to call `add_shortcut(key, value)` on several items</span> <span class='diff-add'> * </span> <span class='diff-add'> * data : Dict of the form {key:value, ...}</span> <span class='diff-add'> **/</span> <span class='diff-add'> for (var shortcut in data) {</span> <span class='diff-add'> this.add_shortcut(shortcut, data[shortcut], true);</span> <span class='diff-add'> }</span> <span class='diff-add'> // update the keyboard shortcuts notebook help</span> <span class='diff-add'> this.events.trigger('rebuild.QuickHelp');</span> <span class='diff-add'> };</span> <span class='diff-add'> ShortcutManager.prototype.remove_shortcut = function (shortcut, suppress_help_update) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Remove the binding of shortcut `sortcut` with its action.</span> <span class='diff-add'> * throw an error if trying to remove a non-exiting shortcut</span> <span class='diff-add'> **/</span> <span class='diff-add'> shortcut = normalize_shortcut(shortcut);</span> <span class='diff-add'> if( typeof(shortcut) === 'string'){</span> <span class='diff-add'> shortcut = shortcut.split(',');</span> <span class='diff-add'> }</span> <span class='diff-add'> this._remove_leaf(shortcut, this._shortcuts);</span> <span class='diff-add'> if (!suppress_help_update) {</span> <span class='diff-add'> // update the keyboard shortcuts notebook help</span> <span class='diff-add'> this.events.trigger('rebuild.QuickHelp');</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> ShortcutManager.prototype.call_handler = function (event) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Call the corresponding shortcut handler for a keyboard event</span> <span class='diff-add'> * @method call_handler</span> <span class='diff-add'> * @return {Boolean} `true|false`, `false` if no handler was found, otherwise the value return by the handler. </span> <span class='diff-add'> * @param event {event}</span> <span class='diff-add'> *</span> <span class='diff-add'> * given an event, call the corresponding shortcut. </span> <span class='diff-add'> * return false is event wan handled, true otherwise </span> <span class='diff-add'> * in any case returning false stop event propagation</span> <span class='diff-add'> **/</span> <span class='diff-add'> this.clearsoon();</span> <span class='diff-add'> if(only_modifier_event(event)){</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> var shortcut = event_to_shortcut(event);</span> <span class='diff-add'> this._queue.push(shortcut);</span> <span class='diff-add'> var action_name = this.get_shortcut(this._queue);</span> <span class='diff-add'> if (typeof(action_name) === 'undefined'|| action_name === null){</span> <span class='diff-add'> this.clearqueue();</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> if (this.actions.exists(action_name)) {</span> <span class='diff-add'> event.preventDefault();</span> <span class='diff-add'> this.clearqueue();</span> <span class='diff-add'> return this.actions.call(action_name, event);</span> <span class='diff-add'> }</span> <span class='diff-add'> return false;</span> <span class='diff-add'> };</span> <span class='diff-add'> ShortcutManager.prototype.handles = function (event) {</span> <span class='diff-add'> var shortcut = event_to_shortcut(event);</span> <span class='diff-add'> var action_name = this.get_shortcut(this._queue.concat(shortcut));</span> <span class='diff-add'> return (typeof(action_name) !== 'undefined');</span> <span class='diff-add'> };</span> <span class='diff-add'> var keyboard = {</span> <span class='diff-add'> keycodes : keycodes,</span> <span class='diff-add'> inv_keycodes : inv_keycodes,</span> <span class='diff-add'> ShortcutManager : ShortcutManager,</span> <span class='diff-add'> normalize_key : normalize_key,</span> <span class='diff-add'> normalize_shortcut : normalize_shortcut,</span> <span class='diff-add'> shortcut_to_event : shortcut_to_event,</span> <span class='diff-add'> event_to_shortcut : event_to_shortcut,</span> <span class='diff-add'> };</span> <span class='diff-add'> // For backwards compatibility.</span> <span class='diff-add'> IPython.keyboard = keyboard;</span> <span class='diff-add'> return keyboard;</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/keyboardmanager.js b/ipynb/Array-feature-overlap-05_files/keyboardmanager.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..82d3d36</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/keyboardmanager.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>/**</span> <span class='diff-add'> *</span> <span class='diff-add'> *</span> <span class='diff-add'> * @module keyboardmanager</span> <span class='diff-add'> * @namespace keyboardmanager</span> <span class='diff-add'> * @class KeyboardManager</span> <span class='diff-add'> */</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> 'base/js/keyboard',</span> <span class='diff-add'>], function(IPython, $, utils, keyboard) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> </span> <span class='diff-add'> // Main keyboard manager for the notebook</span> <span class='diff-add'> var keycodes = keyboard.keycodes;</span> <span class='diff-add'> var KeyboardManager = function (options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * A class to deal with keyboard event and shortcut</span> <span class='diff-add'> *</span> <span class='diff-add'> * @class KeyboardManager</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param options {dict} Dictionary of keyword arguments :</span> <span class='diff-add'> * @param options.events {$(Events)} instance </span> <span class='diff-add'> * @param options.pager: {Pager} pager instance</span> <span class='diff-add'> */</span> <span class='diff-add'> this.mode = 'command';</span> <span class='diff-add'> this.enabled = true;</span> <span class='diff-add'> this.pager = options.pager;</span> <span class='diff-add'> this.quick_help = undefined;</span> <span class='diff-add'> this.notebook = undefined;</span> <span class='diff-add'> this.last_mode = undefined;</span> <span class='diff-add'> this.bind_events();</span> <span class='diff-add'> this.env = {pager:this.pager};</span> <span class='diff-add'> this.actions = options.actions;</span> <span class='diff-add'> this.command_shortcuts = new keyboard.ShortcutManager(undefined, options.events, this.actions, this.env );</span> <span class='diff-add'> this.command_shortcuts.add_shortcuts(this.get_default_common_shortcuts());</span> <span class='diff-add'> this.command_shortcuts.add_shortcuts(this.get_default_command_shortcuts());</span> <span class='diff-add'> this.edit_shortcuts = new keyboard.ShortcutManager(undefined, options.events, this.actions, this.env);</span> <span class='diff-add'> this.edit_shortcuts.add_shortcuts(this.get_default_common_shortcuts());</span> <span class='diff-add'> this.edit_shortcuts.add_shortcuts(this.get_default_edit_shortcuts());</span> <span class='diff-add'> Object.seal(this);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Return a dict of common shortcut</span> <span class='diff-add'> * @method get_default_common_shortcuts</span> <span class='diff-add'> *</span> <span class='diff-add'> * @example Example of returned shortcut</span> <span class='diff-add'> * ```</span> <span class='diff-add'> * 'shortcut-key': 'action-name'</span> <span class='diff-add'> * // a string representing the shortcut as dash separated value.</span> <span class='diff-add'> * // e.g. 'shift' , 'shift-enter', 'cmd-t'</span> <span class='diff-add'> *```</span> <span class='diff-add'> */</span> <span class='diff-add'> KeyboardManager.prototype.get_default_common_shortcuts = function() {</span> <span class='diff-add'> return {</span> <span class='diff-add'> 'shift' : 'ipython.ignore',</span> <span class='diff-add'> 'shift-enter' : 'ipython.run-select-next',</span> <span class='diff-add'> 'ctrl-enter' : 'ipython.execute-in-place',</span> <span class='diff-add'> 'alt-enter' : 'ipython.execute-and-insert-after',</span> <span class='diff-add'> // cmd on mac, ctrl otherwise</span> <span class='diff-add'> 'cmdtrl-s' : 'ipython.save-notebook',</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> KeyboardManager.prototype.get_default_edit_shortcuts = function() {</span> <span class='diff-add'> return {</span> <span class='diff-add'> 'esc' : 'ipython.go-to-command-mode',</span> <span class='diff-add'> 'ctrl-m' : 'ipython.go-to-command-mode',</span> <span class='diff-add'> 'up' : 'ipython.move-cursor-up-or-previous-cell',</span> <span class='diff-add'> 'down' : 'ipython.move-cursor-down-or-next-cell',</span> <span class='diff-add'> 'ctrl-shift--' : 'ipython.split-cell-at-cursor',</span> <span class='diff-add'> 'ctrl-shift-subtract' : 'ipython.split-cell-at-cursor'</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> KeyboardManager.prototype.get_default_command_shortcuts = function() {</span> <span class='diff-add'> return {</span> <span class='diff-add'> 'shift-space': 'ipython.scroll-up',</span> <span class='diff-add'> 'shift-v' : 'ipython.paste-cell-before',</span> <span class='diff-add'> 'shift-m' : 'ipython.merge-selected-cell-with-cell-after',</span> <span class='diff-add'> 'shift-o' : 'ipython.toggle-output-scrolling-selected-cell',</span> <span class='diff-add'> 'enter' : 'ipython.enter-edit-mode',</span> <span class='diff-add'> 'space' : 'ipython.scroll-down',</span> <span class='diff-add'> 'down' : 'ipython.select-next-cell',</span> <span class='diff-add'> 'i,i' : 'ipython.interrupt-kernel',</span> <span class='diff-add'> '0,0' : 'ipython.restart-kernel',</span> <span class='diff-add'> 'd,d' : 'ipython.delete-cell',</span> <span class='diff-add'> 'esc': 'ipython.close-pager',</span> <span class='diff-add'> 'up' : 'ipython.select-previous-cell',</span> <span class='diff-add'> 'k' : 'ipython.select-previous-cell',</span> <span class='diff-add'> 'j' : 'ipython.select-next-cell',</span> <span class='diff-add'> 'x' : 'ipython.cut-selected-cell',</span> <span class='diff-add'> 'c' : 'ipython.copy-selected-cell',</span> <span class='diff-add'> 'v' : 'ipython.paste-cell-after',</span> <span class='diff-add'> 'a' : 'ipython.insert-cell-before',</span> <span class='diff-add'> 'b' : 'ipython.insert-cell-after',</span> <span class='diff-add'> 'y' : 'ipython.change-selected-cell-to-code-cell',</span> <span class='diff-add'> 'm' : 'ipython.change-selected-cell-to-markdown-cell',</span> <span class='diff-add'> 'r' : 'ipython.change-selected-cell-to-raw-cell',</span> <span class='diff-add'> '1' : 'ipython.change-selected-cell-to-heading-1',</span> <span class='diff-add'> '2' : 'ipython.change-selected-cell-to-heading-2',</span> <span class='diff-add'> '3' : 'ipython.change-selected-cell-to-heading-3',</span> <span class='diff-add'> '4' : 'ipython.change-selected-cell-to-heading-4',</span> <span class='diff-add'> '5' : 'ipython.change-selected-cell-to-heading-5',</span> <span class='diff-add'> '6' : 'ipython.change-selected-cell-to-heading-6',</span> <span class='diff-add'> 'o' : 'ipython.toggle-output-visibility-selected-cell',</span> <span class='diff-add'> 's' : 'ipython.save-notebook',</span> <span class='diff-add'> 'l' : 'ipython.toggle-line-number-selected-cell',</span> <span class='diff-add'> 'h' : 'ipython.show-keyboard-shortcut-help-dialog',</span> <span class='diff-add'> 'z' : 'ipython.undo-last-cell-deletion',</span> <span class='diff-add'> 'q' : 'ipython.close-pager',</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> KeyboardManager.prototype.bind_events = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> $(document).keydown(function (event) {</span> <span class='diff-add'> if(event._ipkmIgnore===true||(event.originalEvent||{})._ipkmIgnore===true){</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> return that.handle_keydown(event);</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> KeyboardManager.prototype.set_notebook = function (notebook) {</span> <span class='diff-add'> this.notebook = notebook;</span> <span class='diff-add'> this.actions.extend_env({notebook:notebook});</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> KeyboardManager.prototype.set_quickhelp = function (notebook) {</span> <span class='diff-add'> this.actions.extend_env({quick_help:notebook});</span> <span class='diff-add'> };</span> <span class='diff-add'> KeyboardManager.prototype.handle_keydown = function (event) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * returning false from this will stop event propagation</span> <span class='diff-add'> **/</span> <span class='diff-add'> if (event.which === keycodes.esc) {</span> <span class='diff-add'> // Intercept escape at highest level to avoid closing</span> <span class='diff-add'> // websocket connection with firefox</span> <span class='diff-add'> event.preventDefault();</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> if (!this.enabled) {</span> <span class='diff-add'> if (event.which === keycodes.esc) {</span> <span class='diff-add'> this.notebook.command_mode();</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> if (this.mode === 'edit') {</span> <span class='diff-add'> return this.edit_shortcuts.call_handler(event);</span> <span class='diff-add'> } else if (this.mode === 'command') {</span> <span class='diff-add'> return this.command_shortcuts.call_handler(event);</span> <span class='diff-add'> }</span> <span class='diff-add'> return true;</span> <span class='diff-add'> };</span> <span class='diff-add'> KeyboardManager.prototype.edit_mode = function () {</span> <span class='diff-add'> this.last_mode = this.mode;</span> <span class='diff-add'> this.mode = 'edit';</span> <span class='diff-add'> };</span> <span class='diff-add'> KeyboardManager.prototype.command_mode = function () {</span> <span class='diff-add'> this.last_mode = this.mode;</span> <span class='diff-add'> this.mode = 'command';</span> <span class='diff-add'> };</span> <span class='diff-add'> KeyboardManager.prototype.enable = function () {</span> <span class='diff-add'> this.enabled = true;</span> <span class='diff-add'> };</span> <span class='diff-add'> KeyboardManager.prototype.disable = function () {</span> <span class='diff-add'> this.enabled = false;</span> <span class='diff-add'> };</span> <span class='diff-add'> KeyboardManager.prototype.register_events = function (e) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var handle_focus = function () {</span> <span class='diff-add'> that.disable();</span> <span class='diff-add'> };</span> <span class='diff-add'> var handle_blur = function () {</span> <span class='diff-add'> that.enable();</span> <span class='diff-add'> };</span> <span class='diff-add'> e.on('focusin', handle_focus);</span> <span class='diff-add'> e.on('focusout', handle_blur);</span> <span class='diff-add'> // TODO: Very strange. The focusout event does not seem fire for the </span> <span class='diff-add'> // bootstrap textboxes on FF25&26... This works around that by </span> <span class='diff-add'> // registering focus and blur events recursively on all inputs within</span> <span class='diff-add'> // registered element.</span> <span class='diff-add'> e.find('input').blur(handle_blur);</span> <span class='diff-add'> e.on('DOMNodeInserted', function (event) {</span> <span class='diff-add'> var target = $(event.target);</span> <span class='diff-add'> if (target.is('input')) {</span> <span class='diff-add'> target.blur(handle_blur);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> target.find('input').blur(handle_blur); </span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> // There are times (raw_input) where we remove the element from the DOM before</span> <span class='diff-add'> // focusout is called. In this case we bind to the remove event of jQueryUI,</span> <span class='diff-add'> // which gets triggered upon removal, iff it is focused at the time.</span> <span class='diff-add'> // is_focused must be used to check for the case where an element within</span> <span class='diff-add'> // the element being removed is focused.</span> <span class='diff-add'> e.on('remove', function () {</span> <span class='diff-add'> if (utils.is_focused(e[0])) {</span> <span class='diff-add'> that.enable();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> // For backwards compatibility.</span> <span class='diff-add'> IPython.KeyboardManager = KeyboardManager;</span> <span class='diff-add'> return {'KeyboardManager': KeyboardManager};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/loginwidget.js b/ipynb/Array-feature-overlap-05_files/loginwidget.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..857caf1</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/loginwidget.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'>], function(IPython, utils, $){</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var LoginWidget = function (selector, options) {</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> this.base_url = options.base_url || utils.get_body_data("baseUrl");</span> <span class='diff-add'> this.selector = selector;</span> <span class='diff-add'> if (this.selector !== undefined) {</span> <span class='diff-add'> this.element = $(selector);</span> <span class='diff-add'> this.bind_events();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> LoginWidget.prototype.bind_events = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.element.find("button#logout").click(function () {</span> <span class='diff-add'> window.location = utils.url_join_encode(</span> <span class='diff-add'> that.base_url,</span> <span class='diff-add'> "logout"</span> <span class='diff-add'> );</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find("button#login").click(function () {</span> <span class='diff-add'> window.location = utils.url_join_encode(</span> <span class='diff-add'> that.base_url,</span> <span class='diff-add'> "login"</span> <span class='diff-add'> );</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> // Set module variables</span> <span class='diff-add'> IPython.LoginWidget = LoginWidget;</span> <span class='diff-add'> return {'LoginWidget': LoginWidget};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/logo-64x64.png b/ipynb/Array-feature-overlap-05_files/logo-64x64.png</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..eebbff6</span> Binary files /dev/null and b/ipynb/Array-feature-overlap-05_files/logo-64x64.png differ <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/logo.png b/ipynb/Array-feature-overlap-05_files/logo.png</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..54cc416</span> Binary files /dev/null and b/ipynb/Array-feature-overlap-05_files/logo.png differ <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/main.js b/ipynb/Array-feature-overlap-05_files/main.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..31df711</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/main.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>require([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'notebook/js/notebook',</span> <span class='diff-add'> 'contents',</span> <span class='diff-add'> 'services/config',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> 'base/js/page',</span> <span class='diff-add'> 'base/js/events',</span> <span class='diff-add'> 'auth/js/loginwidget',</span> <span class='diff-add'> 'notebook/js/maintoolbar',</span> <span class='diff-add'> 'notebook/js/pager',</span> <span class='diff-add'> 'notebook/js/quickhelp',</span> <span class='diff-add'> 'notebook/js/menubar',</span> <span class='diff-add'> 'notebook/js/notificationarea',</span> <span class='diff-add'> 'notebook/js/savewidget',</span> <span class='diff-add'> 'notebook/js/actions',</span> <span class='diff-add'> 'notebook/js/keyboardmanager',</span> <span class='diff-add'> 'notebook/js/kernelselector',</span> <span class='diff-add'> 'codemirror/lib/codemirror',</span> <span class='diff-add'> 'notebook/js/about',</span> <span class='diff-add'> // only loaded, not used, please keep sure this is loaded last</span> <span class='diff-add'> 'custom/custom'</span> <span class='diff-add'>], function(</span> <span class='diff-add'> IPython, </span> <span class='diff-add'> $,</span> <span class='diff-add'> notebook, </span> <span class='diff-add'> contents,</span> <span class='diff-add'> configmod,</span> <span class='diff-add'> utils, </span> <span class='diff-add'> page, </span> <span class='diff-add'> events,</span> <span class='diff-add'> loginwidget, </span> <span class='diff-add'> maintoolbar, </span> <span class='diff-add'> pager, </span> <span class='diff-add'> quickhelp, </span> <span class='diff-add'> menubar, </span> <span class='diff-add'> notificationarea, </span> <span class='diff-add'> savewidget,</span> <span class='diff-add'> actions,</span> <span class='diff-add'> keyboardmanager,</span> <span class='diff-add'> kernelselector,</span> <span class='diff-add'> CodeMirror,</span> <span class='diff-add'> about,</span> <span class='diff-add'> // please keep sure that even if not used, this is loaded last</span> <span class='diff-add'> custom</span> <span class='diff-add'> ) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> // compat with old IPython, remove for IPython > 3.0</span> <span class='diff-add'> window.CodeMirror = CodeMirror;</span> <span class='diff-add'> var common_options = {</span> <span class='diff-add'> ws_url : utils.get_body_data("wsUrl"),</span> <span class='diff-add'> base_url : utils.get_body_data("baseUrl"),</span> <span class='diff-add'> notebook_path : utils.get_body_data("notebookPath"),</span> <span class='diff-add'> notebook_name : utils.get_body_data('notebookName')</span> <span class='diff-add'> };</span> <span class='diff-add'> var config_section = new configmod.ConfigSection('notebook', common_options);</span> <span class='diff-add'> config_section.load();</span> <span class='diff-add'> var common_config = new configmod.ConfigSection('common', common_options);</span> <span class='diff-add'> common_config.load();</span> <span class='diff-add'> var page = new page.Page();</span> <span class='diff-add'> var pager = new pager.Pager('div#pager', {</span> <span class='diff-add'> events: events});</span> <span class='diff-add'> var acts = new actions.init();</span> <span class='diff-add'> var keyboard_manager = new keyboardmanager.KeyboardManager({</span> <span class='diff-add'> pager: pager, </span> <span class='diff-add'> events: events, </span> <span class='diff-add'> actions: acts });</span> <span class='diff-add'> var save_widget = new savewidget.SaveWidget('span#save_widget', {</span> <span class='diff-add'> events: events, </span> <span class='diff-add'> keyboard_manager: keyboard_manager});</span> <span class='diff-add'> var contents = new contents.Contents({</span> <span class='diff-add'> base_url: common_options.base_url,</span> <span class='diff-add'> common_config: common_config</span> <span class='diff-add'> });</span> <span class='diff-add'> var notebook = new notebook.Notebook('div#notebook', $.extend({</span> <span class='diff-add'> events: events,</span> <span class='diff-add'> keyboard_manager: keyboard_manager,</span> <span class='diff-add'> save_widget: save_widget,</span> <span class='diff-add'> contents: contents,</span> <span class='diff-add'> config: config_section},</span> <span class='diff-add'> common_options));</span> <span class='diff-add'> var login_widget = new loginwidget.LoginWidget('span#login_widget', common_options);</span> <span class='diff-add'> var toolbar = new maintoolbar.MainToolBar('#maintoolbar-container', {</span> <span class='diff-add'> notebook: notebook, </span> <span class='diff-add'> events: events, </span> <span class='diff-add'> actions: acts}); </span> <span class='diff-add'> var quick_help = new quickhelp.QuickHelp({</span> <span class='diff-add'> keyboard_manager: keyboard_manager, </span> <span class='diff-add'> events: events,</span> <span class='diff-add'> notebook: notebook});</span> <span class='diff-add'> keyboard_manager.set_notebook(notebook);</span> <span class='diff-add'> keyboard_manager.set_quickhelp(quick_help);</span> <span class='diff-add'> var menubar = new menubar.MenuBar('#menubar', $.extend({</span> <span class='diff-add'> notebook: notebook, </span> <span class='diff-add'> contents: contents,</span> <span class='diff-add'> events: events, </span> <span class='diff-add'> save_widget: save_widget, </span> <span class='diff-add'> quick_help: quick_help}, </span> <span class='diff-add'> common_options));</span> <span class='diff-add'> var notification_area = new notificationarea.NotebookNotificationArea(</span> <span class='diff-add'> '#notification_area', {</span> <span class='diff-add'> events: events, </span> <span class='diff-add'> save_widget: save_widget, </span> <span class='diff-add'> notebook: notebook,</span> <span class='diff-add'> keyboard_manager: keyboard_manager});</span> <span class='diff-add'> notification_area.init_notification_widgets();</span> <span class='diff-add'> var kernel_selector = new kernelselector.KernelSelector(</span> <span class='diff-add'> '#kernel_logo_widget', notebook);</span> <span class='diff-add'> $('body').append('<div id="fonttest"><pre><span id="test1">x</span>'+</span> <span class='diff-add'> '<span id="test2" style="font-weight: bold;">x</span>'+</span> <span class='diff-add'> '<span id="test3" style="font-style: italic;">x</span></pre></div>');</span> <span class='diff-add'> var nh = $('#test1').innerHeight();</span> <span class='diff-add'> var bh = $('#test2').innerHeight();</span> <span class='diff-add'> var ih = $('#test3').innerHeight();</span> <span class='diff-add'> if(nh != bh || nh != ih) {</span> <span class='diff-add'> $('head').append('<style>.CodeMirror span { vertical-align: bottom; }</style>');</span> <span class='diff-add'> }</span> <span class='diff-add'> $('#fonttest').remove();</span> <span class='diff-add'> page.show();</span> <span class='diff-add'> var first_load = function () {</span> <span class='diff-add'> var hash = document.location.hash;</span> <span class='diff-add'> if (hash) {</span> <span class='diff-add'> document.location.hash = '';</span> <span class='diff-add'> document.location.hash = hash;</span> <span class='diff-add'> }</span> <span class='diff-add'> notebook.set_autosave_interval(notebook.minimum_autosave_interval);</span> <span class='diff-add'> // only do this once</span> <span class='diff-add'> events.off('notebook_loaded.Notebook', first_load);</span> <span class='diff-add'> };</span> <span class='diff-add'> events.on('notebook_loaded.Notebook', first_load);</span> <span class='diff-add'> </span> <span class='diff-add'> IPython.page = page;</span> <span class='diff-add'> IPython.notebook = notebook;</span> <span class='diff-add'> IPython.contents = contents;</span> <span class='diff-add'> IPython.pager = pager;</span> <span class='diff-add'> IPython.quick_help = quick_help;</span> <span class='diff-add'> IPython.login_widget = login_widget;</span> <span class='diff-add'> IPython.menubar = menubar;</span> <span class='diff-add'> IPython.toolbar = toolbar;</span> <span class='diff-add'> IPython.notification_area = notification_area;</span> <span class='diff-add'> IPython.keyboard_manager = keyboard_manager;</span> <span class='diff-add'> IPython.save_widget = save_widget;</span> <span class='diff-add'> IPython.tooltip = notebook.tooltip;</span> <span class='diff-add'> events.trigger('app_initialized.NotebookApp');</span> <span class='diff-add'> utils.load_extensions_from_config(config_section);</span> <span class='diff-add'> utils.load_extensions_from_config(common_config);</span> <span class='diff-add'> notebook.load_notebook(common_options.notebook_path);</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/maintoolbar.js b/ipynb/Array-feature-overlap-05_files/maintoolbar.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..cced88c</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/maintoolbar.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'require',</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> './toolbar',</span> <span class='diff-add'> './celltoolbar'</span> <span class='diff-add'>], function(require, IPython, $, toolbar, celltoolbar) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var MainToolBar = function (selector, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Constructor</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters:</span> <span class='diff-add'> * selector: string</span> <span class='diff-add'> * options: dictionary</span> <span class='diff-add'> * Dictionary of keyword arguments.</span> <span class='diff-add'> * events: $(Events) instance</span> <span class='diff-add'> * notebook: Notebook instance</span> <span class='diff-add'> **/</span> <span class='diff-add'> toolbar.ToolBar.apply(this, [selector, options] );</span> <span class='diff-add'> this.events = options.events;</span> <span class='diff-add'> this.notebook = options.notebook;</span> <span class='diff-add'> this._make();</span> <span class='diff-add'> this.notebook.keyboard_manager.register_events(this.element);</span> <span class='diff-add'> Object.seal(this);</span> <span class='diff-add'> };</span> <span class='diff-add'> MainToolBar.prototype = Object.create(toolbar.ToolBar.prototype);</span> <span class='diff-add'> MainToolBar.prototype._make = function () {</span> <span class='diff-add'> var grps = [</span> <span class='diff-add'> [</span> <span class='diff-add'> ['ipython.save-notebook'],</span> <span class='diff-add'> 'save-notbook'</span> <span class='diff-add'> ],</span> <span class='diff-add'> [</span> <span class='diff-add'> ['ipython.insert-cell-after'],</span> <span class='diff-add'> 'insert_above_below'],</span> <span class='diff-add'> [</span> <span class='diff-add'> ['ipython.cut-selected-cell',</span> <span class='diff-add'> 'ipython.copy-selected-cell',</span> <span class='diff-add'> 'ipython.paste-cell-after'</span> <span class='diff-add'> ] ,</span> <span class='diff-add'> 'cut_copy_paste'],</span> <span class='diff-add'> [</span> <span class='diff-add'> ['ipython.move-selected-cell-up',</span> <span class='diff-add'> 'ipython.move-selected-cell-down'</span> <span class='diff-add'> ],</span> <span class='diff-add'> 'move_up_down'],</span> <span class='diff-add'> [ ['ipython.run-select-next',</span> <span class='diff-add'> 'ipython.interrupt-kernel',</span> <span class='diff-add'> 'ipython.restart-kernel'</span> <span class='diff-add'> ],</span> <span class='diff-add'> 'run_int'],</span> <span class='diff-add'> ['<add_celltype_list>'],</span> <span class='diff-add'> ['<add_celltoolbar_list>']</span> <span class='diff-add'> ];</span> <span class='diff-add'> this.construct(grps);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> // add a cell type drop down to the maintoolbar.</span> <span class='diff-add'> // triggered when the pseudo action `<add_celltype_list>` is</span> <span class='diff-add'> // encountered when building a toolbar.</span> <span class='diff-add'> MainToolBar.prototype._pseudo_actions.add_celltype_list = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var sel = $('<select/>')</span> <span class='diff-add'> .attr('id','cell_type')</span> <span class='diff-add'> .addClass('form-control select-xs')</span> <span class='diff-add'> .append($('<option/>').attr('value','code').text('Code'))</span> <span class='diff-add'> .append($('<option/>').attr('value','markdown').text('Markdown'))</span> <span class='diff-add'> .append($('<option/>').attr('value','raw').text('Raw NBConvert'))</span> <span class='diff-add'> .append($('<option/>').attr('value','heading').text('Heading'));</span> <span class='diff-add'> this.events.on('selected_cell_type_changed.Notebook', function (event, data) {</span> <span class='diff-add'> if (data.cell_type === 'heading') {</span> <span class='diff-add'> sel.val('Markdown');</span> <span class='diff-add'> } else {</span> <span class='diff-add'> sel.val(data.cell_type);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> sel.change(function () {</span> <span class='diff-add'> var cell_type = $(this).val();</span> <span class='diff-add'> switch (cell_type) {</span> <span class='diff-add'> case 'code':</span> <span class='diff-add'> that.notebook.to_code();</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'markdown':</span> <span class='diff-add'> that.notebook.to_markdown();</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'raw':</span> <span class='diff-add'> that.notebook.to_raw();</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'heading':</span> <span class='diff-add'> that.notebook._warn_heading();</span> <span class='diff-add'> that.notebook.to_heading();</span> <span class='diff-add'> sel.val('markdown');</span> <span class='diff-add'> break;</span> <span class='diff-add'> default:</span> <span class='diff-add'> console.log("unrecognized cell type:", cell_type);</span> <span class='diff-add'> }</span> <span class='diff-add'> that.notebook.focus_cell();</span> <span class='diff-add'> });</span> <span class='diff-add'> return sel;</span> <span class='diff-add'> };</span> <span class='diff-add'> MainToolBar.prototype._pseudo_actions.add_celltoolbar_list = function () {</span> <span class='diff-add'> var label = $('<span/>').addClass("navbar-text").text('Cell Toolbar:');</span> <span class='diff-add'> var select = $('<select/>')</span> <span class='diff-add'> .attr('id', 'ctb_select')</span> <span class='diff-add'> .addClass('form-control select-xs')</span> <span class='diff-add'> .append($('<option/>').attr('value', '').text('None'));</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> select.change(function() {</span> <span class='diff-add'> var val = $(this).val();</span> <span class='diff-add'> if (val ==='') {</span> <span class='diff-add'> celltoolbar.CellToolbar.global_hide();</span> <span class='diff-add'> delete that.notebook.metadata.celltoolbar;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> celltoolbar.CellToolbar.global_show();</span> <span class='diff-add'> celltoolbar.CellToolbar.activate_preset(val, that.events);</span> <span class='diff-add'> that.notebook.metadata.celltoolbar = val;</span> <span class='diff-add'> }</span> <span class='diff-add'> that.notebook.focus_cell();</span> <span class='diff-add'> });</span> <span class='diff-add'> // Setup the currently registered presets.</span> <span class='diff-add'> var presets = celltoolbar.CellToolbar.list_presets();</span> <span class='diff-add'> for (var i=0; i<presets.length; i++) {</span> <span class='diff-add'> var name = presets[i];</span> <span class='diff-add'> select.append($('<option/>').attr('value', name).text(name));</span> <span class='diff-add'> }</span> <span class='diff-add'> // Setup future preset registrations.</span> <span class='diff-add'> this.events.on('preset_added.CellToolbar', function (event, data) {</span> <span class='diff-add'> var name = data.name;</span> <span class='diff-add'> select.append($('<option/>').attr('value', name).text(name));</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('unregistered_preset.CellToolbar', function (event, data) {</span> <span class='diff-add'> if (select.val() === data.name){</span> <span class='diff-add'> select.val('');</span> <span class='diff-add'> celltoolbar.CellToolbar.global_hide();</span> <span class='diff-add'> delete that.notebook.metadata.celltoolbar;</span> <span class='diff-add'> }</span> <span class='diff-add'> select.find("option[value='"+name+"']" ).remove();</span> <span class='diff-add'> });</span> <span class='diff-add'> // Update select value when a preset is activated.</span> <span class='diff-add'> this.events.on('preset_activated.CellToolbar', function (event, data) {</span> <span class='diff-add'> if (select.val() !== data.name){</span> <span class='diff-add'> select.val(data.name);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> var wrapper = $('<div/>').addClass('btn-group');</span> <span class='diff-add'> wrapper.append(label).append(select);</span> <span class='diff-add'> return wrapper;</span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatibility.</span> <span class='diff-add'> IPython.MainToolBar = MainToolBar;</span> <span class='diff-add'> return {'MainToolBar': MainToolBar};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/manager.js b/ipynb/Array-feature-overlap-05_files/manager.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..d1bcd61</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/manager.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> "underscore",</span> <span class='diff-add'> "backbone",</span> <span class='diff-add'> "jquery",</span> <span class='diff-add'> "base/js/utils",</span> <span class='diff-add'> "base/js/namespace",</span> <span class='diff-add'> "services/kernels/comm"</span> <span class='diff-add'>], function (_, Backbone, $, utils, IPython, comm) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> //--------------------------------------------------------------------</span> <span class='diff-add'> // WidgetManager class</span> <span class='diff-add'> //--------------------------------------------------------------------</span> <span class='diff-add'> var WidgetManager = function (comm_manager, notebook) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Public constructor</span> <span class='diff-add'> */</span> <span class='diff-add'> WidgetManager._managers.push(this);</span> <span class='diff-add'> // Attach a comm manager to the </span> <span class='diff-add'> this.keyboard_manager = notebook.keyboard_manager;</span> <span class='diff-add'> this.notebook = notebook;</span> <span class='diff-add'> this.comm_manager = comm_manager;</span> <span class='diff-add'> this.comm_target_name = 'ipython.widget';</span> <span class='diff-add'> this._models = {}; /* Dictionary of model ids and model instance promises */</span> <span class='diff-add'> // Register with the comm manager.</span> <span class='diff-add'> this.comm_manager.register_target(this.comm_target_name, $.proxy(this._handle_comm_open, this));</span> <span class='diff-add'> // Load the initial state of the widget manager if a load callback was</span> <span class='diff-add'> // registered.</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> if (WidgetManager._load_callback) {</span> <span class='diff-add'> Promise.resolve(WidgetManager._load_callback.call(this)).then(function(state) {</span> <span class='diff-add'> that.set_state(state);</span> <span class='diff-add'> }).catch(utils.reject('Error loading widget manager state', true));</span> <span class='diff-add'> }</span> <span class='diff-add'> // Setup state saving code.</span> <span class='diff-add'> this.notebook.events.on('before_save.Notebook', function() {</span> <span class='diff-add'> var save_callback = WidgetManager._save_callback;</span> <span class='diff-add'> var options = WidgetManager._get_state_options;</span> <span class='diff-add'> if (save_callback) {</span> <span class='diff-add'> that.get_state(options).then(function(state) {</span> <span class='diff-add'> save_callback.call(that, state);</span> <span class='diff-add'> }).catch(utils.reject('Could not call widget save state callback.', true));</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> //--------------------------------------------------------------------</span> <span class='diff-add'> // Class level</span> <span class='diff-add'> //--------------------------------------------------------------------</span> <span class='diff-add'> WidgetManager._model_types = {}; /* Dictionary of model type names (target_name) and model types. */</span> <span class='diff-add'> WidgetManager._view_types = {}; /* Dictionary of view names and view types. */</span> <span class='diff-add'> WidgetManager._managers = []; /* List of widget managers */</span> <span class='diff-add'> WidgetManager._load_callback = null;</span> <span class='diff-add'> WidgetManager._save_callback = null;</span> <span class='diff-add'> WidgetManager.register_widget_model = function (model_name, model_type) {</span> <span class='diff-add'> /** </span> <span class='diff-add'> * Registers a widget model by name.</span> <span class='diff-add'> */</span> <span class='diff-add'> WidgetManager._model_types[model_name] = model_type;</span> <span class='diff-add'> };</span> <span class='diff-add'> WidgetManager.register_widget_view = function (view_name, view_type) {</span> <span class='diff-add'> /** </span> <span class='diff-add'> * Registers a widget view by name.</span> <span class='diff-add'> */</span> <span class='diff-add'> WidgetManager._view_types[view_name] = view_type;</span> <span class='diff-add'> };</span> <span class='diff-add'> WidgetManager.set_state_callbacks = function (load_callback, save_callback, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Registers callbacks for widget state persistence.</span> <span class='diff-add'> * </span> <span class='diff-add'> * Parameters</span> <span class='diff-add'> * ----------</span> <span class='diff-add'> * load_callback: function()</span> <span class='diff-add'> * function that is called when the widget manager state should be</span> <span class='diff-add'> * loaded. This function should return a promise for the widget</span> <span class='diff-add'> * manager state. An empty state is an empty dictionary `{}`.</span> <span class='diff-add'> * save_callback: function(state as dictionary)</span> <span class='diff-add'> * function that is called when the notebook is saved or autosaved.</span> <span class='diff-add'> * The current state of the widget manager is passed in as the first</span> <span class='diff-add'> * argument.</span> <span class='diff-add'> */</span> <span class='diff-add'> WidgetManager._load_callback = load_callback;</span> <span class='diff-add'> WidgetManager._save_callback = save_callback;</span> <span class='diff-add'> WidgetManager._get_state_options = options;</span> <span class='diff-add'> // Use the load callback to immediately load widget states.</span> <span class='diff-add'> WidgetManager._managers.forEach(function(manager) {</span> <span class='diff-add'> if (load_callback) {</span> <span class='diff-add'> Promise.resolve(load_callback.call(manager)).then(function(state) {</span> <span class='diff-add'> manager.set_state(state);</span> <span class='diff-add'> }).catch(utils.reject('Error loading widget manager state', true));</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> // Use local storage to persist widgets across page refresh by default.</span> <span class='diff-add'> // LocalStorage is per domain, so we need to explicitly set the URL</span> <span class='diff-add'> // that the widgets are associated with so they don't show on other </span> <span class='diff-add'> // pages hosted by the noteboook server.</span> <span class='diff-add'> var url = [window.location.protocol, '//', window.location.host, window.location.pathname].join('');</span> <span class='diff-add'> var key = 'widgets:' + url;</span> <span class='diff-add'> WidgetManager.set_state_callbacks(function() {</span> <span class='diff-add'> if (localStorage[key]) {</span> <span class='diff-add'> return JSON.parse(localStorage[key]);</span> <span class='diff-add'> }</span> <span class='diff-add'> return {};</span> <span class='diff-add'> }, function(state) {</span> <span class='diff-add'> localStorage[key] = JSON.stringify(state);</span> <span class='diff-add'> });</span> <span class='diff-add'> //--------------------------------------------------------------------</span> <span class='diff-add'> // Instance level</span> <span class='diff-add'> //--------------------------------------------------------------------</span> <span class='diff-add'> WidgetManager.prototype.display_view = function(msg, model) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Displays a view for a particular model.</span> <span class='diff-add'> */</span> <span class='diff-add'> var cell = this.get_msg_cell(msg.parent_header.msg_id);</span> <span class='diff-add'> if (cell === null) {</span> <span class='diff-add'> return Promise.reject(new Error("Could not determine where the display" + </span> <span class='diff-add'> " message was from. Widget will not be displayed"));</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return this.display_view_in_cell(cell, model)</span> <span class='diff-add'> .catch(utils.reject('Could not display view', true)); </span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> WidgetManager.prototype.display_view_in_cell = function(cell, model) {</span> <span class='diff-add'> // Displays a view in a cell.</span> <span class='diff-add'> if (cell.display_widget_view) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> return cell.display_widget_view(this.create_view(model, {</span> <span class='diff-add'> cell: cell,</span> <span class='diff-add'> // Only set cell_index when view is displayed as directly.</span> <span class='diff-add'> cell_index: that.notebook.find_cell_index(cell),</span> <span class='diff-add'> })).then(function(view) {</span> <span class='diff-add'> that._handle_display_view(view);</span> <span class='diff-add'> view.trigger('displayed');</span> <span class='diff-add'> return view;</span> <span class='diff-add'> }).catch(utils.reject('Could not create or display view', true)); </span> <span class='diff-add'> } else {</span> <span class='diff-add'> return Promise.reject(new Error('Cell does not have a `display_widget_view` method'));</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> WidgetManager.prototype._handle_display_view = function (view) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Have the IPython keyboard manager disable its event</span> <span class='diff-add'> * handling so the widget can capture keyboard input.</span> <span class='diff-add'> * Note, this is only done on the outer most widgets.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (this.keyboard_manager) {</span> <span class='diff-add'> this.keyboard_manager.register_events(view.$el);</span> <span class='diff-add'> </span> <span class='diff-add'> if (view.additional_elements) {</span> <span class='diff-add'> for (var i = 0; i < view.additional_elements.length; i++) {</span> <span class='diff-add'> this.keyboard_manager.register_events(view.additional_elements[i]);</span> <span class='diff-add'> }</span> <span class='diff-add'> } </span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> WidgetManager.prototype.create_view = function(model, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Creates a promise for a view of a given model</span> <span class='diff-add'> *</span> <span class='diff-add'> * Make sure the view creation is not out of order with </span> <span class='diff-add'> * any state updates.</span> <span class='diff-add'> */</span> <span class='diff-add'> model.state_change = model.state_change.then(function() {</span> <span class='diff-add'> </span> <span class='diff-add'> return utils.load_class(model.get('_view_name'), model.get('_view_module'),</span> <span class='diff-add'> WidgetManager._view_types).then(function(ViewType) {</span> <span class='diff-add'> // If a view is passed into the method, use that view's cell as</span> <span class='diff-add'> // the cell for the view that is created.</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> if (options.parent !== undefined) {</span> <span class='diff-add'> options.cell = options.parent.options.cell;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Create and render the view...</span> <span class='diff-add'> var parameters = {model: model, options: options};</span> <span class='diff-add'> var view = new ViewType(parameters);</span> <span class='diff-add'> view.listenTo(model, 'destroy', view.remove);</span> <span class='diff-add'> return Promise.resolve(view.render()).then(function() {return view;});</span> <span class='diff-add'> }).catch(utils.reject("Couldn't create a view for model id '" + String(model.id) + "'", true));</span> <span class='diff-add'> });</span> <span class='diff-add'> var id = utils.uuid();</span> <span class='diff-add'> model.views[id] = model.state_change;</span> <span class='diff-add'> model.state_change.then(function(view) { </span> <span class='diff-add'> view.once('remove', function() {</span> <span class='diff-add'> delete view.model.views[id];</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> });</span> <span class='diff-add'> return model.state_change;</span> <span class='diff-add'> };</span> <span class='diff-add'> WidgetManager.prototype.get_msg_cell = function (msg_id) {</span> <span class='diff-add'> var cell = null;</span> <span class='diff-add'> // First, check to see if the msg was triggered by cell execution.</span> <span class='diff-add'> if (this.notebook) {</span> <span class='diff-add'> cell = this.notebook.get_msg_cell(msg_id);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (cell !== null) {</span> <span class='diff-add'> return cell;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Second, check to see if a get_cell callback was defined</span> <span class='diff-add'> // for the message. get_cell callbacks are registered for</span> <span class='diff-add'> // widget messages, so this block is actually checking to see if the</span> <span class='diff-add'> // message was triggered by a widget.</span> <span class='diff-add'> var kernel = this.comm_manager.kernel;</span> <span class='diff-add'> if (kernel) {</span> <span class='diff-add'> var callbacks = kernel.get_callbacks_for_msg(msg_id);</span> <span class='diff-add'> if (callbacks && callbacks.iopub &&</span> <span class='diff-add'> callbacks.iopub.get_cell !== undefined) {</span> <span class='diff-add'> return callbacks.iopub.get_cell();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> // Not triggered by a cell or widget (no get_cell callback </span> <span class='diff-add'> // exists).</span> <span class='diff-add'> return null;</span> <span class='diff-add'> };</span> <span class='diff-add'> WidgetManager.prototype.callbacks = function (view) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * callback handlers specific a view</span> <span class='diff-add'> */</span> <span class='diff-add'> var callbacks = {};</span> <span class='diff-add'> if (view && view.options.cell) {</span> <span class='diff-add'> // Try to get output handlers</span> <span class='diff-add'> var cell = view.options.cell;</span> <span class='diff-add'> var handle_output = null;</span> <span class='diff-add'> var handle_clear_output = null;</span> <span class='diff-add'> if (cell.output_area) {</span> <span class='diff-add'> handle_output = $.proxy(cell.output_area.handle_output, cell.output_area);</span> <span class='diff-add'> handle_clear_output = $.proxy(cell.output_area.handle_clear_output, cell.output_area);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Create callback dictionary using what is known</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> callbacks = {</span> <span class='diff-add'> iopub : {</span> <span class='diff-add'> output : handle_output,</span> <span class='diff-add'> clear_output : handle_clear_output,</span> <span class='diff-add'> // Special function only registered by widget messages.</span> <span class='diff-add'> // Allows us to get the cell for a message so we know</span> <span class='diff-add'> // where to add widgets if the code requires it.</span> <span class='diff-add'> get_cell : function () {</span> <span class='diff-add'> return cell;</span> <span class='diff-add'> },</span> <span class='diff-add'> },</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> return callbacks;</span> <span class='diff-add'> };</span> <span class='diff-add'> WidgetManager.prototype.get_model = function (model_id) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get a promise for a model by model id.</span> <span class='diff-add'> */</span> <span class='diff-add'> return this._models[model_id];</span> <span class='diff-add'> };</span> <span class='diff-add'> WidgetManager.prototype._handle_comm_open = function (comm, msg) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle when a comm is opened.</span> <span class='diff-add'> */</span> <span class='diff-add'> return this.create_model({</span> <span class='diff-add'> model_name: msg.content.data.model_name, </span> <span class='diff-add'> model_module: msg.content.data.model_module, </span> <span class='diff-add'> comm: comm}).catch(utils.reject("Couldn't create a model.", true));</span> <span class='diff-add'> };</span> <span class='diff-add'> WidgetManager.prototype.create_model = function (options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Create and return a promise for a new widget model</span> <span class='diff-add'> *</span> <span class='diff-add'> * Minimally, one must provide the model_name and widget_class</span> <span class='diff-add'> * parameters to create a model from Javascript.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Example</span> <span class='diff-add'> * --------</span> <span class='diff-add'> * JS:</span> <span class='diff-add'> * IPython.notebook.kernel.widget_manager.create_model({</span> <span class='diff-add'> * model_name: 'WidgetModel', </span> <span class='diff-add'> * widget_class: 'IPython.html.widgets.widget_int.IntSlider'})</span> <span class='diff-add'> * .then(function(model) { console.log('Create success!', model); },</span> <span class='diff-add'> * $.proxy(console.error, console));</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters</span> <span class='diff-add'> * ----------</span> <span class='diff-add'> * options: dictionary</span> <span class='diff-add'> * Dictionary of options with the following contents:</span> <span class='diff-add'> * model_name: string</span> <span class='diff-add'> * Target name of the widget model to create.</span> <span class='diff-add'> * model_module: (optional) string</span> <span class='diff-add'> * Module name of the widget model to create.</span> <span class='diff-add'> * widget_class: (optional) string</span> <span class='diff-add'> * Target name of the widget in the back-end.</span> <span class='diff-add'> * comm: (optional) Comm</span> <span class='diff-add'> *</span> <span class='diff-add'> * Create a comm if it wasn't provided.</span> <span class='diff-add'> */</span> <span class='diff-add'> var comm = options.comm;</span> <span class='diff-add'> if (!comm) {</span> <span class='diff-add'> comm = this.comm_manager.new_comm('ipython.widget', {'widget_class': options.widget_class});</span> <span class='diff-add'> }</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var model_id = comm.comm_id;</span> <span class='diff-add'> var model_promise = utils.load_class(options.model_name, options.model_module, WidgetManager._model_types)</span> <span class='diff-add'> .then(function(ModelType) {</span> <span class='diff-add'> var widget_model = new ModelType(that, model_id, comm);</span> <span class='diff-add'> widget_model.once('comm:close', function () {</span> <span class='diff-add'> delete that._models[model_id];</span> <span class='diff-add'> });</span> <span class='diff-add'> widget_model.name = options.model_name;</span> <span class='diff-add'> widget_model.module = options.model_module;</span> <span class='diff-add'> return widget_model;</span> <span class='diff-add'> }, function(error) {</span> <span class='diff-add'> delete that._models[model_id];</span> <span class='diff-add'> var wrapped_error = new utils.WrappedError("Couldn't create model", error);</span> <span class='diff-add'> return Promise.reject(wrapped_error);</span> <span class='diff-add'> });</span> <span class='diff-add'> this._models[model_id] = model_promise;</span> <span class='diff-add'> return model_promise;</span> <span class='diff-add'> };</span> <span class='diff-add'> WidgetManager.prototype.get_state = function(options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Asynchronously get the state of the widget manager.</span> <span class='diff-add'> *</span> <span class='diff-add'> * This includes all of the widget models and the cells that they are</span> <span class='diff-add'> * displayed in.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters</span> <span class='diff-add'> * ----------</span> <span class='diff-add'> * options: dictionary</span> <span class='diff-add'> * Dictionary of options with the following contents:</span> <span class='diff-add'> * only_displayed: (optional) boolean=false</span> <span class='diff-add'> * Only return models with one or more displayed views.</span> <span class='diff-add'> * not_live: (optional) boolean=false</span> <span class='diff-add'> * Include models that have comms with severed connections.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Returns</span> <span class='diff-add'> * -------</span> <span class='diff-add'> * Promise for a state dictionary</span> <span class='diff-add'> */</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> return utils.resolve_promises_dict(this._models).then(function(models) {</span> <span class='diff-add'> var state = {};</span> <span class='diff-add'> var model_promises = [];</span> <span class='diff-add'> for (var model_id in models) {</span> <span class='diff-add'> if (models.hasOwnProperty(model_id)) {</span> <span class='diff-add'> var model = models[model_id];</span> <span class='diff-add'> // If the model has one or more views defined for it,</span> <span class='diff-add'> // consider it displayed.</span> <span class='diff-add'> var displayed_flag = !(options && options.only_displayed) || Object.keys(model.views).length > 0;</span> <span class='diff-add'> var live_flag = (options && options.not_live) || model.comm_live;</span> <span class='diff-add'> if (displayed_flag && live_flag) {</span> <span class='diff-add'> state[model_id] = {</span> <span class='diff-add'> model_name: model.name,</span> <span class='diff-add'> model_module: model.module,</span> <span class='diff-add'> state: model.get_state(),</span> <span class='diff-add'> views: [],</span> <span class='diff-add'> };</span> <span class='diff-add'> // Get the views that are displayed *now*.</span> <span class='diff-add'> (function(local_state) {</span> <span class='diff-add'> model_promises.push(utils.resolve_promises_dict(model.views).then(function(model_views) {</span> <span class='diff-add'> for (var id in model_views) {</span> <span class='diff-add'> if (model_views.hasOwnProperty(id)) {</span> <span class='diff-add'> var view = model_views[id];</span> <span class='diff-add'> if (view.options.cell_index) {</span> <span class='diff-add'> local_state.views.push(view.options.cell_index);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }));</span> <span class='diff-add'> })(state[model_id]);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return Promise.all(model_promises).then(function() { return state; });</span> <span class='diff-add'> }).catch(utils.reject('Could not get state of widget manager', true));</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> WidgetManager.prototype.set_state = function(state) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set the notebook's state.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Reconstructs all of the widget models and attempts to redisplay the</span> <span class='diff-add'> * widgets in the appropriate cells by cell index.</span> <span class='diff-add'> */</span> <span class='diff-add'> </span> <span class='diff-add'> // Get the kernel when it's available.</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> return this._get_connected_kernel().then(function(kernel) {</span> <span class='diff-add'> </span> <span class='diff-add'> // Recreate all the widget models for the given state and </span> <span class='diff-add'> // display the views.</span> <span class='diff-add'> that.all_views = [];</span> <span class='diff-add'> var model_ids = Object.keys(state);</span> <span class='diff-add'> for (var i = 0; i < model_ids.length; i++) {</span> <span class='diff-add'> var model_id = model_ids[i];</span> <span class='diff-add'> </span> <span class='diff-add'> // Recreate a comm using the widget's model id (model_id == comm_id).</span> <span class='diff-add'> var new_comm = new comm.Comm(kernel.widget_manager.comm_target_name, model_id);</span> <span class='diff-add'> kernel.comm_manager.register_comm(new_comm);</span> <span class='diff-add'> // Create the model using the recreated comm. When the model is</span> <span class='diff-add'> // created we don't know yet if the comm is valid so set_comm_live</span> <span class='diff-add'> // false. Once we receive the first state push from the back-end</span> <span class='diff-add'> // we know the comm is alive.</span> <span class='diff-add'> var views = kernel.widget_manager.create_model({</span> <span class='diff-add'> comm: new_comm, </span> <span class='diff-add'> model_name: state[model_id].model_name, </span> <span class='diff-add'> model_module: state[model_id].model_module})</span> <span class='diff-add'> .then(function(model) {</span> <span class='diff-add'> model.set_comm_live(false);</span> <span class='diff-add'> var view_promise = Promise.resolve().then(function() {</span> <span class='diff-add'> return model.set_state(state[model.id].state);</span> <span class='diff-add'> }).then(function() {</span> <span class='diff-add'> model.request_state().then(function() {</span> <span class='diff-add'> model.set_comm_live(true);</span> <span class='diff-add'> });</span> <span class='diff-add'> // Display the views of the model.</span> <span class='diff-add'> var views = [];</span> <span class='diff-add'> var model_views = state[model.id].views;</span> <span class='diff-add'> for (var j=0; j<model_views.length; j++) {</span> <span class='diff-add'> var cell_index = model_views[j];</span> <span class='diff-add'> var cell = that.notebook.get_cell(cell_index);</span> <span class='diff-add'> views.push(that.display_view_in_cell(cell, model));</span> <span class='diff-add'> }</span> <span class='diff-add'> return Promise.all(views);</span> <span class='diff-add'> });</span> <span class='diff-add'> return view_promise;</span> <span class='diff-add'> });</span> <span class='diff-add'> that.all_views.push(views);</span> <span class='diff-add'> }</span> <span class='diff-add'> return Promise.all(that.all_views);</span> <span class='diff-add'> }).catch(utils.reject('Could not set widget manager state.', true)); </span> <span class='diff-add'> };</span> <span class='diff-add'> WidgetManager.prototype._get_connected_kernel = function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Gets a promise for a connected kernel</span> <span class='diff-add'> */</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> return new Promise(function(resolve, reject) {</span> <span class='diff-add'> if (that.comm_manager && </span> <span class='diff-add'> that.comm_manager.kernel && </span> <span class='diff-add'> that.comm_manager.kernel.is_connected()) {</span> <span class='diff-add'> resolve(that.comm_manager.kernel);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> that.notebook.events.on('kernel_connected.Kernel', function(event, data) {</span> <span class='diff-add'> resolve(data.kernel);</span> <span class='diff-add'> });</span> <span class='diff-add'> } </span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatibility.</span> <span class='diff-add'> IPython.WidgetManager = WidgetManager;</span> <span class='diff-add'> return {'WidgetManager': WidgetManager};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/markdown.js b/ipynb/Array-feature-overlap-05_files/markdown.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..3c80311</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/markdown.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span> <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span> <span class='diff-add'>(function(mod) {</span> <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span> <span class='diff-add'> mod(require("../../lib/codemirror"), require("../xml/xml"), require("../meta"));</span> <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span> <span class='diff-add'> define(["../../lib/codemirror", "../xml/xml", "../meta"], mod);</span> <span class='diff-add'> else // Plain browser env</span> <span class='diff-add'> mod(CodeMirror);</span> <span class='diff-add'>})(function(CodeMirror) {</span> <span class='diff-add'>"use strict";</span> <span class='diff-add'>CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {</span> <span class='diff-add'> var htmlFound = CodeMirror.modes.hasOwnProperty("xml");</span> <span class='diff-add'> var htmlMode = CodeMirror.getMode(cmCfg, htmlFound ? {name: "xml", htmlMode: true} : "text/plain");</span> <span class='diff-add'> function getMode(name) {</span> <span class='diff-add'> if (CodeMirror.findModeByName) {</span> <span class='diff-add'> var found = CodeMirror.findModeByName(name);</span> <span class='diff-add'> if (found) name = found.mime || found.mimes[0];</span> <span class='diff-add'> }</span> <span class='diff-add'> var mode = CodeMirror.getMode(cmCfg, name);</span> <span class='diff-add'> return mode.name == "null" ? null : mode;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Should characters that affect highlighting be highlighted separate?</span> <span class='diff-add'> // Does not include characters that will be output (such as `1.` and `-` for lists)</span> <span class='diff-add'> if (modeCfg.highlightFormatting === undefined)</span> <span class='diff-add'> modeCfg.highlightFormatting = false;</span> <span class='diff-add'> // Maximum number of nested blockquotes. Set to 0 for infinite nesting.</span> <span class='diff-add'> // Excess `>` will emit `error` token.</span> <span class='diff-add'> if (modeCfg.maxBlockquoteDepth === undefined)</span> <span class='diff-add'> modeCfg.maxBlockquoteDepth = 0;</span> <span class='diff-add'> // Should underscores in words open/close em/strong?</span> <span class='diff-add'> if (modeCfg.underscoresBreakWords === undefined)</span> <span class='diff-add'> modeCfg.underscoresBreakWords = true;</span> <span class='diff-add'> // Turn on fenced code blocks? ("```" to start/end)</span> <span class='diff-add'> if (modeCfg.fencedCodeBlocks === undefined) modeCfg.fencedCodeBlocks = false;</span> <span class='diff-add'> // Turn on task lists? ("- [ ] " and "- [x] ")</span> <span class='diff-add'> if (modeCfg.taskLists === undefined) modeCfg.taskLists = false;</span> <span class='diff-add'> // Turn on strikethrough syntax</span> <span class='diff-add'> if (modeCfg.strikethrough === undefined)</span> <span class='diff-add'> modeCfg.strikethrough = false;</span> <span class='diff-add'> var codeDepth = 0;</span> <span class='diff-add'> var header = 'header'</span> <span class='diff-add'> , code = 'comment'</span> <span class='diff-add'> , quote = 'quote'</span> <span class='diff-add'> , list1 = 'variable-2'</span> <span class='diff-add'> , list2 = 'variable-3'</span> <span class='diff-add'> , list3 = 'keyword'</span> <span class='diff-add'> , hr = 'hr'</span> <span class='diff-add'> , image = 'tag'</span> <span class='diff-add'> , formatting = 'formatting'</span> <span class='diff-add'> , linkinline = 'link'</span> <span class='diff-add'> , linkemail = 'link'</span> <span class='diff-add'> , linktext = 'link'</span> <span class='diff-add'> , linkhref = 'string'</span> <span class='diff-add'> , em = 'em'</span> <span class='diff-add'> , strong = 'strong'</span> <span class='diff-add'> , strikethrough = 'strikethrough';</span> <span class='diff-add'> var hrRE = /^([*\-=_])(?:\s*\1){2,}\s*$/</span> <span class='diff-add'> , ulRE = /^[*\-+]\s+/</span> <span class='diff-add'> , olRE = /^[0-9]+\.\s+/</span> <span class='diff-add'> , taskListRE = /^\[(x| )\](?=\s)/ // Must follow ulRE or olRE</span> <span class='diff-add'> , atxHeaderRE = /^#+/</span> <span class='diff-add'> , setextHeaderRE = /^(?:\={1,}|-{1,})$/</span> <span class='diff-add'> , textRE = /^[^#!\[\]*_\\<>` "'(~]+/;</span> <span class='diff-add'> function switchInline(stream, state, f) {</span> <span class='diff-add'> state.f = state.inline = f;</span> <span class='diff-add'> return f(stream, state);</span> <span class='diff-add'> }</span> <span class='diff-add'> function switchBlock(stream, state, f) {</span> <span class='diff-add'> state.f = state.block = f;</span> <span class='diff-add'> return f(stream, state);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Blocks</span> <span class='diff-add'> function blankLine(state) {</span> <span class='diff-add'> // Reset linkTitle state</span> <span class='diff-add'> state.linkTitle = false;</span> <span class='diff-add'> // Reset EM state</span> <span class='diff-add'> state.em = false;</span> <span class='diff-add'> // Reset STRONG state</span> <span class='diff-add'> state.strong = false;</span> <span class='diff-add'> // Reset strikethrough state</span> <span class='diff-add'> state.strikethrough = false;</span> <span class='diff-add'> // Reset state.quote</span> <span class='diff-add'> state.quote = 0;</span> <span class='diff-add'> if (!htmlFound && state.f == htmlBlock) {</span> <span class='diff-add'> state.f = inlineNormal;</span> <span class='diff-add'> state.block = blockNormal;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Reset state.trailingSpace</span> <span class='diff-add'> state.trailingSpace = 0;</span> <span class='diff-add'> state.trailingSpaceNewLine = false;</span> <span class='diff-add'> // Mark this line as blank</span> <span class='diff-add'> state.thisLineHasContent = false;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> function blockNormal(stream, state) {</span> <span class='diff-add'> var sol = stream.sol();</span> <span class='diff-add'> var prevLineIsList = (state.list !== false);</span> <span class='diff-add'> if (state.list !== false && state.indentationDiff >= 0) { // Continued list</span> <span class='diff-add'> if (state.indentationDiff < 4) { // Only adjust indentation if *not* a code block</span> <span class='diff-add'> state.indentation -= state.indentationDiff;</span> <span class='diff-add'> }</span> <span class='diff-add'> state.list = null;</span> <span class='diff-add'> } else if (state.list !== false && state.indentation > 0) {</span> <span class='diff-add'> state.list = null;</span> <span class='diff-add'> state.listDepth = Math.floor(state.indentation / 4);</span> <span class='diff-add'> } else if (state.list !== false) { // No longer a list</span> <span class='diff-add'> state.list = false;</span> <span class='diff-add'> state.listDepth = 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> var match = null;</span> <span class='diff-add'> if (state.indentationDiff >= 4) {</span> <span class='diff-add'> state.indentation -= 4;</span> <span class='diff-add'> stream.skipToEnd();</span> <span class='diff-add'> return code;</span> <span class='diff-add'> } else if (stream.eatSpace()) {</span> <span class='diff-add'> return null;</span> <span class='diff-add'> } else if (match = stream.match(atxHeaderRE)) {</span> <span class='diff-add'> state.header = match[0].length <= 6 ? match[0].length : 6;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "header";</span> <span class='diff-add'> state.f = state.inline;</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> } else if (state.prevLineHasContent && (match = stream.match(setextHeaderRE))) {</span> <span class='diff-add'> state.header = match[0].charAt(0) == '=' ? 1 : 2;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "header";</span> <span class='diff-add'> state.f = state.inline;</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> } else if (stream.eat('>')) {</span> <span class='diff-add'> state.indentation++;</span> <span class='diff-add'> state.quote = sol ? 1 : state.quote + 1;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "quote";</span> <span class='diff-add'> stream.eatSpace();</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> } else if (stream.peek() === '[') {</span> <span class='diff-add'> return switchInline(stream, state, footnoteLink);</span> <span class='diff-add'> } else if (stream.match(hrRE, true)) {</span> <span class='diff-add'> return hr;</span> <span class='diff-add'> } else if ((!state.prevLineHasContent || prevLineIsList) && (stream.match(ulRE, false) || stream.match(olRE, false))) {</span> <span class='diff-add'> var listType = null;</span> <span class='diff-add'> if (stream.match(ulRE, true)) {</span> <span class='diff-add'> listType = 'ul';</span> <span class='diff-add'> } else {</span> <span class='diff-add'> stream.match(olRE, true);</span> <span class='diff-add'> listType = 'ol';</span> <span class='diff-add'> }</span> <span class='diff-add'> state.indentation += 4;</span> <span class='diff-add'> state.list = true;</span> <span class='diff-add'> state.listDepth++;</span> <span class='diff-add'> if (modeCfg.taskLists && stream.match(taskListRE, false)) {</span> <span class='diff-add'> state.taskList = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> state.f = state.inline;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = ["list", "list-" + listType];</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> } else if (modeCfg.fencedCodeBlocks && stream.match(/^```[ \t]*([\w+#]*)/, true)) {</span> <span class='diff-add'> // try switching mode</span> <span class='diff-add'> state.localMode = getMode(RegExp.$1);</span> <span class='diff-add'> if (state.localMode) state.localState = state.localMode.startState();</span> <span class='diff-add'> state.f = state.block = local;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "code-block";</span> <span class='diff-add'> state.code = true;</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> }</span> <span class='diff-add'> return switchInline(stream, state, state.inline);</span> <span class='diff-add'> }</span> <span class='diff-add'> function htmlBlock(stream, state) {</span> <span class='diff-add'> var style = htmlMode.token(stream, state.htmlState);</span> <span class='diff-add'> if ((htmlFound && state.htmlState.tagStart === null && !state.htmlState.context) ||</span> <span class='diff-add'> (state.md_inside && stream.current().indexOf(">") > -1)) {</span> <span class='diff-add'> state.f = inlineNormal;</span> <span class='diff-add'> state.block = blockNormal;</span> <span class='diff-add'> state.htmlState = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> return style;</span> <span class='diff-add'> }</span> <span class='diff-add'> function local(stream, state) {</span> <span class='diff-add'> if (stream.sol() && stream.match("```", false)) {</span> <span class='diff-add'> state.localMode = state.localState = null;</span> <span class='diff-add'> state.f = state.block = leavingLocal;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> } else if (state.localMode) {</span> <span class='diff-add'> return state.localMode.token(stream, state.localState);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> stream.skipToEnd();</span> <span class='diff-add'> return code;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function leavingLocal(stream, state) {</span> <span class='diff-add'> stream.match("```");</span> <span class='diff-add'> state.block = blockNormal;</span> <span class='diff-add'> state.f = inlineNormal;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "code-block";</span> <span class='diff-add'> state.code = true;</span> <span class='diff-add'> var returnType = getType(state);</span> <span class='diff-add'> state.code = false;</span> <span class='diff-add'> return returnType;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Inline</span> <span class='diff-add'> function getType(state) {</span> <span class='diff-add'> var styles = [];</span> <span class='diff-add'> if (state.formatting) {</span> <span class='diff-add'> styles.push(formatting);</span> <span class='diff-add'> if (typeof state.formatting === "string") state.formatting = [state.formatting];</span> <span class='diff-add'> for (var i = 0; i < state.formatting.length; i++) {</span> <span class='diff-add'> styles.push(formatting + "-" + state.formatting[i]);</span> <span class='diff-add'> if (state.formatting[i] === "header") {</span> <span class='diff-add'> styles.push(formatting + "-" + state.formatting[i] + "-" + state.header);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Add `formatting-quote` and `formatting-quote-#` for blockquotes</span> <span class='diff-add'> // Add `error` instead if the maximum blockquote nesting depth is passed</span> <span class='diff-add'> if (state.formatting[i] === "quote") {</span> <span class='diff-add'> if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {</span> <span class='diff-add'> styles.push(formatting + "-" + state.formatting[i] + "-" + state.quote);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> styles.push("error");</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (state.taskOpen) {</span> <span class='diff-add'> styles.push("meta");</span> <span class='diff-add'> return styles.length ? styles.join(' ') : null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (state.taskClosed) {</span> <span class='diff-add'> styles.push("property");</span> <span class='diff-add'> return styles.length ? styles.join(' ') : null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (state.linkHref) {</span> <span class='diff-add'> styles.push(linkhref);</span> <span class='diff-add'> return styles.length ? styles.join(' ') : null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (state.strong) { styles.push(strong); }</span> <span class='diff-add'> if (state.em) { styles.push(em); }</span> <span class='diff-add'> if (state.strikethrough) { styles.push(strikethrough); }</span> <span class='diff-add'> if (state.linkText) { styles.push(linktext); }</span> <span class='diff-add'> if (state.code) { styles.push(code); }</span> <span class='diff-add'> if (state.header) { styles.push(header); styles.push(header + "-" + state.header); }</span> <span class='diff-add'> if (state.quote) {</span> <span class='diff-add'> styles.push(quote);</span> <span class='diff-add'> // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth</span> <span class='diff-add'> if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {</span> <span class='diff-add'> styles.push(quote + "-" + state.quote);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> styles.push(quote + "-" + modeCfg.maxBlockquoteDepth);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (state.list !== false) {</span> <span class='diff-add'> var listMod = (state.listDepth - 1) % 3;</span> <span class='diff-add'> if (!listMod) {</span> <span class='diff-add'> styles.push(list1);</span> <span class='diff-add'> } else if (listMod === 1) {</span> <span class='diff-add'> styles.push(list2);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> styles.push(list3);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (state.trailingSpaceNewLine) {</span> <span class='diff-add'> styles.push("trailing-space-new-line");</span> <span class='diff-add'> } else if (state.trailingSpace) {</span> <span class='diff-add'> styles.push("trailing-space-" + (state.trailingSpace % 2 ? "a" : "b"));</span> <span class='diff-add'> }</span> <span class='diff-add'> return styles.length ? styles.join(' ') : null;</span> <span class='diff-add'> }</span> <span class='diff-add'> function handleText(stream, state) {</span> <span class='diff-add'> if (stream.match(textRE, true)) {</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> }</span> <span class='diff-add'> return undefined;</span> <span class='diff-add'> }</span> <span class='diff-add'> function inlineNormal(stream, state) {</span> <span class='diff-add'> var style = state.text(stream, state);</span> <span class='diff-add'> if (typeof style !== 'undefined')</span> <span class='diff-add'> return style;</span> <span class='diff-add'> if (state.list) { // List marker (*, +, -, 1., etc)</span> <span class='diff-add'> state.list = null;</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (state.taskList) {</span> <span class='diff-add'> var taskOpen = stream.match(taskListRE, true)[1] !== "x";</span> <span class='diff-add'> if (taskOpen) state.taskOpen = true;</span> <span class='diff-add'> else state.taskClosed = true;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "task";</span> <span class='diff-add'> state.taskList = false;</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> }</span> <span class='diff-add'> state.taskOpen = false;</span> <span class='diff-add'> state.taskClosed = false;</span> <span class='diff-add'> if (state.header && stream.match(/^#+$/, true)) {</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "header";</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Get sol() value now, before character is consumed</span> <span class='diff-add'> var sol = stream.sol();</span> <span class='diff-add'> var ch = stream.next();</span> <span class='diff-add'> if (ch === '\\') {</span> <span class='diff-add'> stream.next();</span> <span class='diff-add'> if (modeCfg.highlightFormatting) {</span> <span class='diff-add'> var type = getType(state);</span> <span class='diff-add'> return type ? type + " formatting-escape" : "formatting-escape";</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Matches link titles present on next line</span> <span class='diff-add'> if (state.linkTitle) {</span> <span class='diff-add'> state.linkTitle = false;</span> <span class='diff-add'> var matchCh = ch;</span> <span class='diff-add'> if (ch === '(') {</span> <span class='diff-add'> matchCh = ')';</span> <span class='diff-add'> }</span> <span class='diff-add'> matchCh = (matchCh+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");</span> <span class='diff-add'> var regex = '^\\s*(?:[^' + matchCh + '\\\\]+|\\\\\\\\|\\\\.)' + matchCh;</span> <span class='diff-add'> if (stream.match(new RegExp(regex), true)) {</span> <span class='diff-add'> return linkhref;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // If this block is changed, it may need to be updated in GFM mode</span> <span class='diff-add'> if (ch === '`') {</span> <span class='diff-add'> var previousFormatting = state.formatting;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "code";</span> <span class='diff-add'> var t = getType(state);</span> <span class='diff-add'> var before = stream.pos;</span> <span class='diff-add'> stream.eatWhile('`');</span> <span class='diff-add'> var difference = 1 + stream.pos - before;</span> <span class='diff-add'> if (!state.code) {</span> <span class='diff-add'> codeDepth = difference;</span> <span class='diff-add'> state.code = true;</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> if (difference === codeDepth) { // Must be exact</span> <span class='diff-add'> state.code = false;</span> <span class='diff-add'> return t;</span> <span class='diff-add'> }</span> <span class='diff-add'> state.formatting = previousFormatting;</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (state.code) {</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (ch === '!' && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) {</span> <span class='diff-add'> stream.match(/\[[^\]]*\]/);</span> <span class='diff-add'> state.inline = state.f = linkHref;</span> <span class='diff-add'> return image;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (ch === '[' && stream.match(/.*\](\(.*\)| ?\[.*\])/, false)) {</span> <span class='diff-add'> state.linkText = true;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link";</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (ch === ']' && state.linkText && stream.match(/\(.*\)| ?\[.*\]/, false)) {</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link";</span> <span class='diff-add'> var type = getType(state);</span> <span class='diff-add'> state.linkText = false;</span> <span class='diff-add'> state.inline = state.f = linkHref;</span> <span class='diff-add'> return type;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (ch === '<' && stream.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/, false)) {</span> <span class='diff-add'> state.f = state.inline = linkInline;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link";</span> <span class='diff-add'> var type = getType(state);</span> <span class='diff-add'> if (type){</span> <span class='diff-add'> type += " ";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> type = "";</span> <span class='diff-add'> }</span> <span class='diff-add'> return type + linkinline;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (ch === '<' && stream.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/, false)) {</span> <span class='diff-add'> state.f = state.inline = linkInline;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link";</span> <span class='diff-add'> var type = getType(state);</span> <span class='diff-add'> if (type){</span> <span class='diff-add'> type += " ";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> type = "";</span> <span class='diff-add'> }</span> <span class='diff-add'> return type + linkemail;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (ch === '<' && stream.match(/^\w/, false)) {</span> <span class='diff-add'> if (stream.string.indexOf(">") != -1) {</span> <span class='diff-add'> var atts = stream.string.substring(1,stream.string.indexOf(">"));</span> <span class='diff-add'> if (/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(atts)) {</span> <span class='diff-add'> state.md_inside = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> stream.backUp(1);</span> <span class='diff-add'> state.htmlState = CodeMirror.startState(htmlMode);</span> <span class='diff-add'> return switchBlock(stream, state, htmlBlock);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (ch === '<' && stream.match(/^\/\w*?>/)) {</span> <span class='diff-add'> state.md_inside = false;</span> <span class='diff-add'> return "tag";</span> <span class='diff-add'> }</span> <span class='diff-add'> var ignoreUnderscore = false;</span> <span class='diff-add'> if (!modeCfg.underscoresBreakWords) {</span> <span class='diff-add'> if (ch === '_' && stream.peek() !== '_' && stream.match(/(\w)/, false)) {</span> <span class='diff-add'> var prevPos = stream.pos - 2;</span> <span class='diff-add'> if (prevPos >= 0) {</span> <span class='diff-add'> var prevCh = stream.string.charAt(prevPos);</span> <span class='diff-add'> if (prevCh !== '_' && prevCh.match(/(\w)/, false)) {</span> <span class='diff-add'> ignoreUnderscore = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (ch === '*' || (ch === '_' && !ignoreUnderscore)) {</span> <span class='diff-add'> if (sol && stream.peek() === ' ') {</span> <span class='diff-add'> // Do nothing, surrounded by newline and space</span> <span class='diff-add'> } else if (state.strong === ch && stream.eat(ch)) { // Remove STRONG</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "strong";</span> <span class='diff-add'> var t = getType(state);</span> <span class='diff-add'> state.strong = false;</span> <span class='diff-add'> return t;</span> <span class='diff-add'> } else if (!state.strong && stream.eat(ch)) { // Add STRONG</span> <span class='diff-add'> state.strong = ch;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "strong";</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> } else if (state.em === ch) { // Remove EM</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "em";</span> <span class='diff-add'> var t = getType(state);</span> <span class='diff-add'> state.em = false;</span> <span class='diff-add'> return t;</span> <span class='diff-add'> } else if (!state.em) { // Add EM</span> <span class='diff-add'> state.em = ch;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "em";</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (ch === ' ') {</span> <span class='diff-add'> if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces</span> <span class='diff-add'> if (stream.peek() === ' ') { // Surrounded by spaces, ignore</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> } else { // Not surrounded by spaces, back up pointer</span> <span class='diff-add'> stream.backUp(1);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (modeCfg.strikethrough) {</span> <span class='diff-add'> if (ch === '~' && stream.eatWhile(ch)) {</span> <span class='diff-add'> if (state.strikethrough) {// Remove strikethrough</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "strikethrough";</span> <span class='diff-add'> var t = getType(state);</span> <span class='diff-add'> state.strikethrough = false;</span> <span class='diff-add'> return t;</span> <span class='diff-add'> } else if (stream.match(/^[^\s]/, false)) {// Add strikethrough</span> <span class='diff-add'> state.strikethrough = true;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "strikethrough";</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (ch === ' ') {</span> <span class='diff-add'> if (stream.match(/^~~/, true)) { // Probably surrounded by space</span> <span class='diff-add'> if (stream.peek() === ' ') { // Surrounded by spaces, ignore</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> } else { // Not surrounded by spaces, back up pointer</span> <span class='diff-add'> stream.backUp(2);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (ch === ' ') {</span> <span class='diff-add'> if (stream.match(/ +$/, false)) {</span> <span class='diff-add'> state.trailingSpace++;</span> <span class='diff-add'> } else if (state.trailingSpace) {</span> <span class='diff-add'> state.trailingSpaceNewLine = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> }</span> <span class='diff-add'> function linkInline(stream, state) {</span> <span class='diff-add'> var ch = stream.next();</span> <span class='diff-add'> if (ch === ">") {</span> <span class='diff-add'> state.f = state.inline = inlineNormal;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link";</span> <span class='diff-add'> var type = getType(state);</span> <span class='diff-add'> if (type){</span> <span class='diff-add'> type += " ";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> type = "";</span> <span class='diff-add'> }</span> <span class='diff-add'> return type + linkinline;</span> <span class='diff-add'> }</span> <span class='diff-add'> stream.match(/^[^>]+/, true);</span> <span class='diff-add'> return linkinline;</span> <span class='diff-add'> }</span> <span class='diff-add'> function linkHref(stream, state) {</span> <span class='diff-add'> // Check if space, and return NULL if so (to avoid marking the space)</span> <span class='diff-add'> if(stream.eatSpace()){</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> var ch = stream.next();</span> <span class='diff-add'> if (ch === '(' || ch === '[') {</span> <span class='diff-add'> state.f = state.inline = getLinkHrefInside(ch === "(" ? ")" : "]");</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link-string";</span> <span class='diff-add'> state.linkHref = true;</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> }</span> <span class='diff-add'> return 'error';</span> <span class='diff-add'> }</span> <span class='diff-add'> function getLinkHrefInside(endChar) {</span> <span class='diff-add'> return function(stream, state) {</span> <span class='diff-add'> var ch = stream.next();</span> <span class='diff-add'> if (ch === endChar) {</span> <span class='diff-add'> state.f = state.inline = inlineNormal;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link-string";</span> <span class='diff-add'> var returnState = getType(state);</span> <span class='diff-add'> state.linkHref = false;</span> <span class='diff-add'> return returnState;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (stream.match(inlineRE(endChar), true)) {</span> <span class='diff-add'> stream.backUp(1);</span> <span class='diff-add'> }</span> <span class='diff-add'> state.linkHref = true;</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> function footnoteLink(stream, state) {</span> <span class='diff-add'> if (stream.match(/^[^\]]*\]:/, false)) {</span> <span class='diff-add'> state.f = footnoteLinkInside;</span> <span class='diff-add'> stream.next(); // Consume [</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link";</span> <span class='diff-add'> state.linkText = true;</span> <span class='diff-add'> return getType(state);</span> <span class='diff-add'> }</span> <span class='diff-add'> return switchInline(stream, state, inlineNormal);</span> <span class='diff-add'> }</span> <span class='diff-add'> function footnoteLinkInside(stream, state) {</span> <span class='diff-add'> if (stream.match(/^\]:/, true)) {</span> <span class='diff-add'> state.f = state.inline = footnoteUrl;</span> <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link";</span> <span class='diff-add'> var returnType = getType(state);</span> <span class='diff-add'> state.linkText = false;</span> <span class='diff-add'> return returnType;</span> <span class='diff-add'> }</span> <span class='diff-add'> stream.match(/^[^\]]+/, true);</span> <span class='diff-add'> return linktext;</span> <span class='diff-add'> }</span> <span class='diff-add'> function footnoteUrl(stream, state) {</span> <span class='diff-add'> // Check if space, and return NULL if so (to avoid marking the space)</span> <span class='diff-add'> if(stream.eatSpace()){</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Match URL</span> <span class='diff-add'> stream.match(/^[^\s]+/, true);</span> <span class='diff-add'> // Check for link title</span> <span class='diff-add'> if (stream.peek() === undefined) { // End of line, set flag to check next line</span> <span class='diff-add'> state.linkTitle = true;</span> <span class='diff-add'> } else { // More content on line, check if link title</span> <span class='diff-add'> stream.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/, true);</span> <span class='diff-add'> }</span> <span class='diff-add'> state.f = state.inline = inlineNormal;</span> <span class='diff-add'> return linkhref;</span> <span class='diff-add'> }</span> <span class='diff-add'> var savedInlineRE = [];</span> <span class='diff-add'> function inlineRE(endChar) {</span> <span class='diff-add'> if (!savedInlineRE[endChar]) {</span> <span class='diff-add'> // Escape endChar for RegExp (taken from http://stackoverflow.com/a/494122/526741)</span> <span class='diff-add'> endChar = (endChar+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");</span> <span class='diff-add'> // Match any non-endChar, escaped character, as well as the closing</span> <span class='diff-add'> // endChar.</span> <span class='diff-add'> savedInlineRE[endChar] = new RegExp('^(?:[^\\\\]|\\\\.)*?(' + endChar + ')');</span> <span class='diff-add'> }</span> <span class='diff-add'> return savedInlineRE[endChar];</span> <span class='diff-add'> }</span> <span class='diff-add'> var mode = {</span> <span class='diff-add'> startState: function() {</span> <span class='diff-add'> return {</span> <span class='diff-add'> f: blockNormal,</span> <span class='diff-add'> prevLineHasContent: false,</span> <span class='diff-add'> thisLineHasContent: false,</span> <span class='diff-add'> block: blockNormal,</span> <span class='diff-add'> htmlState: null,</span> <span class='diff-add'> indentation: 0,</span> <span class='diff-add'> inline: inlineNormal,</span> <span class='diff-add'> text: handleText,</span> <span class='diff-add'> formatting: false,</span> <span class='diff-add'> linkText: false,</span> <span class='diff-add'> linkHref: false,</span> <span class='diff-add'> linkTitle: false,</span> <span class='diff-add'> em: false,</span> <span class='diff-add'> strong: false,</span> <span class='diff-add'> header: 0,</span> <span class='diff-add'> taskList: false,</span> <span class='diff-add'> list: false,</span> <span class='diff-add'> listDepth: 0,</span> <span class='diff-add'> quote: 0,</span> <span class='diff-add'> trailingSpace: 0,</span> <span class='diff-add'> trailingSpaceNewLine: false,</span> <span class='diff-add'> strikethrough: false</span> <span class='diff-add'> };</span> <span class='diff-add'> },</span> <span class='diff-add'> copyState: function(s) {</span> <span class='diff-add'> return {</span> <span class='diff-add'> f: s.f,</span> <span class='diff-add'> prevLineHasContent: s.prevLineHasContent,</span> <span class='diff-add'> thisLineHasContent: s.thisLineHasContent,</span> <span class='diff-add'> block: s.block,</span> <span class='diff-add'> htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState),</span> <span class='diff-add'> indentation: s.indentation,</span> <span class='diff-add'> localMode: s.localMode,</span> <span class='diff-add'> localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null,</span> <span class='diff-add'> inline: s.inline,</span> <span class='diff-add'> text: s.text,</span> <span class='diff-add'> formatting: false,</span> <span class='diff-add'> linkTitle: s.linkTitle,</span> <span class='diff-add'> em: s.em,</span> <span class='diff-add'> strong: s.strong,</span> <span class='diff-add'> strikethrough: s.strikethrough,</span> <span class='diff-add'> header: s.header,</span> <span class='diff-add'> taskList: s.taskList,</span> <span class='diff-add'> list: s.list,</span> <span class='diff-add'> listDepth: s.listDepth,</span> <span class='diff-add'> quote: s.quote,</span> <span class='diff-add'> trailingSpace: s.trailingSpace,</span> <span class='diff-add'> trailingSpaceNewLine: s.trailingSpaceNewLine,</span> <span class='diff-add'> md_inside: s.md_inside</span> <span class='diff-add'> };</span> <span class='diff-add'> },</span> <span class='diff-add'> token: function(stream, state) {</span> <span class='diff-add'> // Reset state.formatting</span> <span class='diff-add'> state.formatting = false;</span> <span class='diff-add'> if (stream.sol()) {</span> <span class='diff-add'> var forceBlankLine = !!state.header;</span> <span class='diff-add'> // Reset state.header</span> <span class='diff-add'> state.header = 0;</span> <span class='diff-add'> if (stream.match(/^\s*$/, true) || forceBlankLine) {</span> <span class='diff-add'> state.prevLineHasContent = false;</span> <span class='diff-add'> blankLine(state);</span> <span class='diff-add'> return forceBlankLine ? this.token(stream, state) : null;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> state.prevLineHasContent = state.thisLineHasContent;</span> <span class='diff-add'> state.thisLineHasContent = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Reset state.taskList</span> <span class='diff-add'> state.taskList = false;</span> <span class='diff-add'> // Reset state.code</span> <span class='diff-add'> state.code = false;</span> <span class='diff-add'> // Reset state.trailingSpace</span> <span class='diff-add'> state.trailingSpace = 0;</span> <span class='diff-add'> state.trailingSpaceNewLine = false;</span> <span class='diff-add'> state.f = state.block;</span> <span class='diff-add'> var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, ' ').length;</span> <span class='diff-add'> var difference = Math.floor((indentation - state.indentation) / 4) * 4;</span> <span class='diff-add'> if (difference > 4) difference = 4;</span> <span class='diff-add'> var adjustedIndentation = state.indentation + difference;</span> <span class='diff-add'> state.indentationDiff = adjustedIndentation - state.indentation;</span> <span class='diff-add'> state.indentation = adjustedIndentation;</span> <span class='diff-add'> if (indentation > 0) return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> return state.f(stream, state);</span> <span class='diff-add'> },</span> <span class='diff-add'> innerMode: function(state) {</span> <span class='diff-add'> if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode};</span> <span class='diff-add'> if (state.localState) return {state: state.localState, mode: state.localMode};</span> <span class='diff-add'> return {state: state, mode: mode};</span> <span class='diff-add'> },</span> <span class='diff-add'> blankLine: blankLine,</span> <span class='diff-add'> getType: getType,</span> <span class='diff-add'> fold: "markdown"</span> <span class='diff-add'> };</span> <span class='diff-add'> return mode;</span> <span class='diff-add'>}, "xml");</span> <span class='diff-add'>CodeMirror.defineMIME("text/x-markdown", "markdown");</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/marked.js b/ipynb/Array-feature-overlap-05_files/marked.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..e2f08c9</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/marked.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>/**</span> <span class='diff-add'> * marked - a markdown parser</span> <span class='diff-add'> * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)</span> <span class='diff-add'> * https://github.com/chjj/marked</span> <span class='diff-add'> */</span> <span class='diff-add'>;(function() {</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Block-Level Grammar</span> <span class='diff-add'> */</span> <span class='diff-add'>var block = {</span> <span class='diff-add'> newline: /^\n+/,</span> <span class='diff-add'> code: /^( {4}[^\n]+\n*)+/,</span> <span class='diff-add'> fences: noop,</span> <span class='diff-add'> hr: /^( *[-*_]){3,} *(?:\n+|$)/,</span> <span class='diff-add'> heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,</span> <span class='diff-add'> nptable: noop,</span> <span class='diff-add'> lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,</span> <span class='diff-add'> blockquote: /^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,</span> <span class='diff-add'> list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,</span> <span class='diff-add'> html: /^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,</span> <span class='diff-add'> def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,</span> <span class='diff-add'> table: noop,</span> <span class='diff-add'> paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,</span> <span class='diff-add'> text: /^[^\n]+/</span> <span class='diff-add'>};</span> <span class='diff-add'>block.bullet = /(?:[*+-]|\d+\.)/;</span> <span class='diff-add'>block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;</span> <span class='diff-add'>block.item = replace(block.item, 'gm')</span> <span class='diff-add'> (/bull/g, block.bullet)</span> <span class='diff-add'> ();</span> <span class='diff-add'>block.list = replace(block.list)</span> <span class='diff-add'> (/bull/g, block.bullet)</span> <span class='diff-add'> ('hr', '\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))')</span> <span class='diff-add'> ('def', '\\n+(?=' + block.def.source + ')')</span> <span class='diff-add'> ();</span> <span class='diff-add'>block.blockquote = replace(block.blockquote)</span> <span class='diff-add'> ('def', block.def)</span> <span class='diff-add'> ();</span> <span class='diff-add'>block._tag = '(?!(?:'</span> <span class='diff-add'> + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'</span> <span class='diff-add'> + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'</span> <span class='diff-add'> + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b';</span> <span class='diff-add'>block.html = replace(block.html)</span> <span class='diff-add'> ('comment', /<!--[\s\S]*?-->/)</span> <span class='diff-add'> ('closed', /<(tag)[\s\S]+?<\/\1>/)</span> <span class='diff-add'> ('closing', /<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)</span> <span class='diff-add'> (/tag/g, block._tag)</span> <span class='diff-add'> ();</span> <span class='diff-add'>block.paragraph = replace(block.paragraph)</span> <span class='diff-add'> ('hr', block.hr)</span> <span class='diff-add'> ('heading', block.heading)</span> <span class='diff-add'> ('lheading', block.lheading)</span> <span class='diff-add'> ('blockquote', block.blockquote)</span> <span class='diff-add'> ('tag', '<' + block._tag)</span> <span class='diff-add'> ('def', block.def)</span> <span class='diff-add'> ();</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Normal Block Grammar</span> <span class='diff-add'> */</span> <span class='diff-add'>block.normal = merge({}, block);</span> <span class='diff-add'>/**</span> <span class='diff-add'> * GFM Block Grammar</span> <span class='diff-add'> */</span> <span class='diff-add'>block.gfm = merge({}, block.normal, {</span> <span class='diff-add'> fences: /^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,</span> <span class='diff-add'> paragraph: /^/</span> <span class='diff-add'>});</span> <span class='diff-add'>block.gfm.paragraph = replace(block.paragraph)</span> <span class='diff-add'> ('(?!', '(?!'</span> <span class='diff-add'> + block.gfm.fences.source.replace('\\1', '\\2') + '|'</span> <span class='diff-add'> + block.list.source.replace('\\1', '\\3') + '|')</span> <span class='diff-add'> ();</span> <span class='diff-add'>/**</span> <span class='diff-add'> * GFM + Tables Block Grammar</span> <span class='diff-add'> */</span> <span class='diff-add'>block.tables = merge({}, block.gfm, {</span> <span class='diff-add'> nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,</span> <span class='diff-add'> table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/</span> <span class='diff-add'>});</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Block Lexer</span> <span class='diff-add'> */</span> <span class='diff-add'>function Lexer(options) {</span> <span class='diff-add'> this.tokens = [];</span> <span class='diff-add'> this.tokens.links = {};</span> <span class='diff-add'> this.options = options || marked.defaults;</span> <span class='diff-add'> this.rules = block.normal;</span> <span class='diff-add'> if (this.options.gfm) {</span> <span class='diff-add'> if (this.options.tables) {</span> <span class='diff-add'> this.rules = block.tables;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.rules = block.gfm;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'>}</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Expose Block Rules</span> <span class='diff-add'> */</span> <span class='diff-add'>Lexer.rules = block;</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Static Lex Method</span> <span class='diff-add'> */</span> <span class='diff-add'>Lexer.lex = function(src, options) {</span> <span class='diff-add'> var lexer = new Lexer(options);</span> <span class='diff-add'> return lexer.lex(src);</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Preprocessing</span> <span class='diff-add'> */</span> <span class='diff-add'>Lexer.prototype.lex = function(src) {</span> <span class='diff-add'> src = src</span> <span class='diff-add'> .replace(/\r\n|\r/g, '\n')</span> <span class='diff-add'> .replace(/\t/g, ' ')</span> <span class='diff-add'> .replace(/\u00a0/g, ' ')</span> <span class='diff-add'> .replace(/\u2424/g, '\n');</span> <span class='diff-add'> return this.token(src, true);</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Lexing</span> <span class='diff-add'> */</span> <span class='diff-add'>Lexer.prototype.token = function(src, top, bq) {</span> <span class='diff-add'> var src = src.replace(/^ +$/gm, '')</span> <span class='diff-add'> , next</span> <span class='diff-add'> , loose</span> <span class='diff-add'> , cap</span> <span class='diff-add'> , bull</span> <span class='diff-add'> , b</span> <span class='diff-add'> , item</span> <span class='diff-add'> , space</span> <span class='diff-add'> , i</span> <span class='diff-add'> , l;</span> <span class='diff-add'> while (src) {</span> <span class='diff-add'> // newline</span> <span class='diff-add'> if (cap = this.rules.newline.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> if (cap[0].length > 1) {</span> <span class='diff-add'> this.tokens.push({</span> <span class='diff-add'> type: 'space'</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // code</span> <span class='diff-add'> if (cap = this.rules.code.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> cap = cap[0].replace(/^ {4}/gm, '');</span> <span class='diff-add'> this.tokens.push({</span> <span class='diff-add'> type: 'code',</span> <span class='diff-add'> text: !this.options.pedantic</span> <span class='diff-add'> ? cap.replace(/\n+$/, '')</span> <span class='diff-add'> : cap</span> <span class='diff-add'> });</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // fences (gfm)</span> <span class='diff-add'> if (cap = this.rules.fences.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> this.tokens.push({</span> <span class='diff-add'> type: 'code',</span> <span class='diff-add'> lang: cap[2],</span> <span class='diff-add'> text: cap[3]</span> <span class='diff-add'> });</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // heading</span> <span class='diff-add'> if (cap = this.rules.heading.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> this.tokens.push({</span> <span class='diff-add'> type: 'heading',</span> <span class='diff-add'> depth: cap[1].length,</span> <span class='diff-add'> text: cap[2]</span> <span class='diff-add'> });</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // table no leading pipe (gfm)</span> <span class='diff-add'> if (top && (cap = this.rules.nptable.exec(src))) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> item = {</span> <span class='diff-add'> type: 'table',</span> <span class='diff-add'> header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),</span> <span class='diff-add'> align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),</span> <span class='diff-add'> cells: cap[3].replace(/\n$/, '').split('\n')</span> <span class='diff-add'> };</span> <span class='diff-add'> for (i = 0; i < item.align.length; i++) {</span> <span class='diff-add'> if (/^ *-+: *$/.test(item.align[i])) {</span> <span class='diff-add'> item.align[i] = 'right';</span> <span class='diff-add'> } else if (/^ *:-+: *$/.test(item.align[i])) {</span> <span class='diff-add'> item.align[i] = 'center';</span> <span class='diff-add'> } else if (/^ *:-+ *$/.test(item.align[i])) {</span> <span class='diff-add'> item.align[i] = 'left';</span> <span class='diff-add'> } else {</span> <span class='diff-add'> item.align[i] = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> for (i = 0; i < item.cells.length; i++) {</span> <span class='diff-add'> item.cells[i] = item.cells[i].split(/ *\| */);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.tokens.push(item);</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // lheading</span> <span class='diff-add'> if (cap = this.rules.lheading.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> this.tokens.push({</span> <span class='diff-add'> type: 'heading',</span> <span class='diff-add'> depth: cap[2] === '=' ? 1 : 2,</span> <span class='diff-add'> text: cap[1]</span> <span class='diff-add'> });</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // hr</span> <span class='diff-add'> if (cap = this.rules.hr.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> this.tokens.push({</span> <span class='diff-add'> type: 'hr'</span> <span class='diff-add'> });</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // blockquote</span> <span class='diff-add'> if (cap = this.rules.blockquote.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> this.tokens.push({</span> <span class='diff-add'> type: 'blockquote_start'</span> <span class='diff-add'> });</span> <span class='diff-add'> cap = cap[0].replace(/^ *> ?/gm, '');</span> <span class='diff-add'> // Pass `top` to keep the current</span> <span class='diff-add'> // "toplevel" state. This is exactly</span> <span class='diff-add'> // how markdown.pl works.</span> <span class='diff-add'> this.token(cap, top, true);</span> <span class='diff-add'> this.tokens.push({</span> <span class='diff-add'> type: 'blockquote_end'</span> <span class='diff-add'> });</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // list</span> <span class='diff-add'> if (cap = this.rules.list.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> bull = cap[2];</span> <span class='diff-add'> this.tokens.push({</span> <span class='diff-add'> type: 'list_start',</span> <span class='diff-add'> ordered: bull.length > 1</span> <span class='diff-add'> });</span> <span class='diff-add'> // Get each top-level item.</span> <span class='diff-add'> cap = cap[0].match(this.rules.item);</span> <span class='diff-add'> next = false;</span> <span class='diff-add'> l = cap.length;</span> <span class='diff-add'> i = 0;</span> <span class='diff-add'> for (; i < l; i++) {</span> <span class='diff-add'> item = cap[i];</span> <span class='diff-add'> // Remove the list item's bullet</span> <span class='diff-add'> // so it is seen as the next token.</span> <span class='diff-add'> space = item.length;</span> <span class='diff-add'> item = item.replace(/^ *([*+-]|\d+\.) +/, '');</span> <span class='diff-add'> // Outdent whatever the</span> <span class='diff-add'> // list item contains. Hacky.</span> <span class='diff-add'> if (~item.indexOf('\n ')) {</span> <span class='diff-add'> space -= item.length;</span> <span class='diff-add'> item = !this.options.pedantic</span> <span class='diff-add'> ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')</span> <span class='diff-add'> : item.replace(/^ {1,4}/gm, '');</span> <span class='diff-add'> }</span> <span class='diff-add'> // Determine whether the next list item belongs here.</span> <span class='diff-add'> // Backpedal if it does not belong in this list.</span> <span class='diff-add'> if (this.options.smartLists && i !== l - 1) {</span> <span class='diff-add'> b = block.bullet.exec(cap[i + 1])[0];</span> <span class='diff-add'> if (bull !== b && !(bull.length > 1 && b.length > 1)) {</span> <span class='diff-add'> src = cap.slice(i + 1).join('\n') + src;</span> <span class='diff-add'> i = l - 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Determine whether item is loose or not.</span> <span class='diff-add'> // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/</span> <span class='diff-add'> // for discount behavior.</span> <span class='diff-add'> loose = next || /\n\n(?!\s*$)/.test(item);</span> <span class='diff-add'> if (i !== l - 1) {</span> <span class='diff-add'> next = item.charAt(item.length - 1) === '\n';</span> <span class='diff-add'> if (!loose) loose = next;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.tokens.push({</span> <span class='diff-add'> type: loose</span> <span class='diff-add'> ? 'loose_item_start'</span> <span class='diff-add'> : 'list_item_start'</span> <span class='diff-add'> });</span> <span class='diff-add'> // Recurse.</span> <span class='diff-add'> this.token(item, false, bq);</span> <span class='diff-add'> this.tokens.push({</span> <span class='diff-add'> type: 'list_item_end'</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> this.tokens.push({</span> <span class='diff-add'> type: 'list_end'</span> <span class='diff-add'> });</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // html</span> <span class='diff-add'> if (cap = this.rules.html.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> this.tokens.push({</span> <span class='diff-add'> type: this.options.sanitize</span> <span class='diff-add'> ? 'paragraph'</span> <span class='diff-add'> : 'html',</span> <span class='diff-add'> pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',</span> <span class='diff-add'> text: cap[0]</span> <span class='diff-add'> });</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // def</span> <span class='diff-add'> if ((!bq && top) && (cap = this.rules.def.exec(src))) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> this.tokens.links[cap[1].toLowerCase()] = {</span> <span class='diff-add'> href: cap[2],</span> <span class='diff-add'> title: cap[3]</span> <span class='diff-add'> };</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // table (gfm)</span> <span class='diff-add'> if (top && (cap = this.rules.table.exec(src))) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> item = {</span> <span class='diff-add'> type: 'table',</span> <span class='diff-add'> header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),</span> <span class='diff-add'> align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),</span> <span class='diff-add'> cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')</span> <span class='diff-add'> };</span> <span class='diff-add'> for (i = 0; i < item.align.length; i++) {</span> <span class='diff-add'> if (/^ *-+: *$/.test(item.align[i])) {</span> <span class='diff-add'> item.align[i] = 'right';</span> <span class='diff-add'> } else if (/^ *:-+: *$/.test(item.align[i])) {</span> <span class='diff-add'> item.align[i] = 'center';</span> <span class='diff-add'> } else if (/^ *:-+ *$/.test(item.align[i])) {</span> <span class='diff-add'> item.align[i] = 'left';</span> <span class='diff-add'> } else {</span> <span class='diff-add'> item.align[i] = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> for (i = 0; i < item.cells.length; i++) {</span> <span class='diff-add'> item.cells[i] = item.cells[i]</span> <span class='diff-add'> .replace(/^ *\| *| *\| *$/g, '')</span> <span class='diff-add'> .split(/ *\| */);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.tokens.push(item);</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // top-level paragraph</span> <span class='diff-add'> if (top && (cap = this.rules.paragraph.exec(src))) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> this.tokens.push({</span> <span class='diff-add'> type: 'paragraph',</span> <span class='diff-add'> text: cap[1].charAt(cap[1].length - 1) === '\n'</span> <span class='diff-add'> ? cap[1].slice(0, -1)</span> <span class='diff-add'> : cap[1]</span> <span class='diff-add'> });</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // text</span> <span class='diff-add'> if (cap = this.rules.text.exec(src)) {</span> <span class='diff-add'> // Top-level should never reach here.</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> this.tokens.push({</span> <span class='diff-add'> type: 'text',</span> <span class='diff-add'> text: cap[0]</span> <span class='diff-add'> });</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (src) {</span> <span class='diff-add'> throw new</span> <span class='diff-add'> Error('Infinite loop on byte: ' + src.charCodeAt(0));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return this.tokens;</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Inline-Level Grammar</span> <span class='diff-add'> */</span> <span class='diff-add'>var inline = {</span> <span class='diff-add'> escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,</span> <span class='diff-add'> autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,</span> <span class='diff-add'> url: noop,</span> <span class='diff-add'> tag: /^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,</span> <span class='diff-add'> link: /^!?\[(inside)\]\(href\)/,</span> <span class='diff-add'> reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,</span> <span class='diff-add'> nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,</span> <span class='diff-add'> strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,</span> <span class='diff-add'> em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,</span> <span class='diff-add'> code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,</span> <span class='diff-add'> br: /^ {2,}\n(?!\s*$)/,</span> <span class='diff-add'> del: noop,</span> <span class='diff-add'> text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/</span> <span class='diff-add'>};</span> <span class='diff-add'>inline._inside = /(?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*/;</span> <span class='diff-add'>inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;</span> <span class='diff-add'>inline.link = replace(inline.link)</span> <span class='diff-add'> ('inside', inline._inside)</span> <span class='diff-add'> ('href', inline._href)</span> <span class='diff-add'> ();</span> <span class='diff-add'>inline.reflink = replace(inline.reflink)</span> <span class='diff-add'> ('inside', inline._inside)</span> <span class='diff-add'> ();</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Normal Inline Grammar</span> <span class='diff-add'> */</span> <span class='diff-add'>inline.normal = merge({}, inline);</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Pedantic Inline Grammar</span> <span class='diff-add'> */</span> <span class='diff-add'>inline.pedantic = merge({}, inline.normal, {</span> <span class='diff-add'> strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,</span> <span class='diff-add'> em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/</span> <span class='diff-add'>});</span> <span class='diff-add'>/**</span> <span class='diff-add'> * GFM Inline Grammar</span> <span class='diff-add'> */</span> <span class='diff-add'>inline.gfm = merge({}, inline.normal, {</span> <span class='diff-add'> escape: replace(inline.escape)('])', '~|])')(),</span> <span class='diff-add'> url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,</span> <span class='diff-add'> del: /^~~(?=\S)([\s\S]*?\S)~~/,</span> <span class='diff-add'> text: replace(inline.text)</span> <span class='diff-add'> (']|', '~]|')</span> <span class='diff-add'> ('|', '|https?://|')</span> <span class='diff-add'> ()</span> <span class='diff-add'>});</span> <span class='diff-add'>/**</span> <span class='diff-add'> * GFM + Line Breaks Inline Grammar</span> <span class='diff-add'> */</span> <span class='diff-add'>inline.breaks = merge({}, inline.gfm, {</span> <span class='diff-add'> br: replace(inline.br)('{2,}', '*')(),</span> <span class='diff-add'> text: replace(inline.gfm.text)('{2,}', '*')()</span> <span class='diff-add'>});</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Inline Lexer & Compiler</span> <span class='diff-add'> */</span> <span class='diff-add'>function InlineLexer(links, options) {</span> <span class='diff-add'> this.options = options || marked.defaults;</span> <span class='diff-add'> this.links = links;</span> <span class='diff-add'> this.rules = inline.normal;</span> <span class='diff-add'> this.renderer = this.options.renderer || new Renderer;</span> <span class='diff-add'> this.renderer.options = this.options;</span> <span class='diff-add'> if (!this.links) {</span> <span class='diff-add'> throw new</span> <span class='diff-add'> Error('Tokens array requires a `links` property.');</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.options.gfm) {</span> <span class='diff-add'> if (this.options.breaks) {</span> <span class='diff-add'> this.rules = inline.breaks;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.rules = inline.gfm;</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (this.options.pedantic) {</span> <span class='diff-add'> this.rules = inline.pedantic;</span> <span class='diff-add'> }</span> <span class='diff-add'>}</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Expose Inline Rules</span> <span class='diff-add'> */</span> <span class='diff-add'>InlineLexer.rules = inline;</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Static Lexing/Compiling Method</span> <span class='diff-add'> */</span> <span class='diff-add'>InlineLexer.output = function(src, links, options) {</span> <span class='diff-add'> var inline = new InlineLexer(links, options);</span> <span class='diff-add'> return inline.output(src);</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Lexing/Compiling</span> <span class='diff-add'> */</span> <span class='diff-add'>InlineLexer.prototype.output = function(src) {</span> <span class='diff-add'> var out = ''</span> <span class='diff-add'> , link</span> <span class='diff-add'> , text</span> <span class='diff-add'> , href</span> <span class='diff-add'> , cap;</span> <span class='diff-add'> while (src) {</span> <span class='diff-add'> // escape</span> <span class='diff-add'> if (cap = this.rules.escape.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> out += cap[1];</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // autolink</span> <span class='diff-add'> if (cap = this.rules.autolink.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> if (cap[2] === '@') {</span> <span class='diff-add'> text = cap[1].charAt(6) === ':'</span> <span class='diff-add'> ? this.mangle(cap[1].substring(7))</span> <span class='diff-add'> : this.mangle(cap[1]);</span> <span class='diff-add'> href = this.mangle('mailto:') + text;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> text = escape(cap[1]);</span> <span class='diff-add'> href = text;</span> <span class='diff-add'> }</span> <span class='diff-add'> out += this.renderer.link(href, null, text);</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // url (gfm)</span> <span class='diff-add'> if (!this.inLink && (cap = this.rules.url.exec(src))) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> text = escape(cap[1]);</span> <span class='diff-add'> href = text;</span> <span class='diff-add'> out += this.renderer.link(href, null, text);</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // tag</span> <span class='diff-add'> if (cap = this.rules.tag.exec(src)) {</span> <span class='diff-add'> if (!this.inLink && /^<a /i.test(cap[0])) {</span> <span class='diff-add'> this.inLink = true;</span> <span class='diff-add'> } else if (this.inLink && /^<\/a>/i.test(cap[0])) {</span> <span class='diff-add'> this.inLink = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> out += this.options.sanitize</span> <span class='diff-add'> ? escape(cap[0])</span> <span class='diff-add'> : cap[0];</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // link</span> <span class='diff-add'> if (cap = this.rules.link.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> this.inLink = true;</span> <span class='diff-add'> out += this.outputLink(cap, {</span> <span class='diff-add'> href: cap[2],</span> <span class='diff-add'> title: cap[3]</span> <span class='diff-add'> });</span> <span class='diff-add'> this.inLink = false;</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // reflink, nolink</span> <span class='diff-add'> if ((cap = this.rules.reflink.exec(src))</span> <span class='diff-add'> || (cap = this.rules.nolink.exec(src))) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> link = (cap[2] || cap[1]).replace(/\s+/g, ' ');</span> <span class='diff-add'> link = this.links[link.toLowerCase()];</span> <span class='diff-add'> if (!link || !link.href) {</span> <span class='diff-add'> out += cap[0].charAt(0);</span> <span class='diff-add'> src = cap[0].substring(1) + src;</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.inLink = true;</span> <span class='diff-add'> out += this.outputLink(cap, link);</span> <span class='diff-add'> this.inLink = false;</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // strong</span> <span class='diff-add'> if (cap = this.rules.strong.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> out += this.renderer.strong(this.output(cap[2] || cap[1]));</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // em</span> <span class='diff-add'> if (cap = this.rules.em.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> out += this.renderer.em(this.output(cap[2] || cap[1]));</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // code</span> <span class='diff-add'> if (cap = this.rules.code.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> out += this.renderer.codespan(escape(cap[2], true));</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // br</span> <span class='diff-add'> if (cap = this.rules.br.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> out += this.renderer.br();</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // del (gfm)</span> <span class='diff-add'> if (cap = this.rules.del.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> out += this.renderer.del(this.output(cap[1]));</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // text</span> <span class='diff-add'> if (cap = this.rules.text.exec(src)) {</span> <span class='diff-add'> src = src.substring(cap[0].length);</span> <span class='diff-add'> out += escape(this.smartypants(cap[0]));</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (src) {</span> <span class='diff-add'> throw new</span> <span class='diff-add'> Error('Infinite loop on byte: ' + src.charCodeAt(0));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return out;</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Compile Link</span> <span class='diff-add'> */</span> <span class='diff-add'>InlineLexer.prototype.outputLink = function(cap, link) {</span> <span class='diff-add'> var href = escape(link.href)</span> <span class='diff-add'> , title = link.title ? escape(link.title) : null;</span> <span class='diff-add'> return cap[0].charAt(0) !== '!'</span> <span class='diff-add'> ? this.renderer.link(href, title, this.output(cap[1]))</span> <span class='diff-add'> : this.renderer.image(href, title, escape(cap[1]));</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Smartypants Transformations</span> <span class='diff-add'> */</span> <span class='diff-add'>InlineLexer.prototype.smartypants = function(text) {</span> <span class='diff-add'> if (!this.options.smartypants) return text;</span> <span class='diff-add'> return text</span> <span class='diff-add'> // em-dashes</span> <span class='diff-add'> .replace(/--/g, '\u2014')</span> <span class='diff-add'> // opening singles</span> <span class='diff-add'> .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')</span> <span class='diff-add'> // closing singles & apostrophes</span> <span class='diff-add'> .replace(/'/g, '\u2019')</span> <span class='diff-add'> // opening doubles</span> <span class='diff-add'> .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')</span> <span class='diff-add'> // closing doubles</span> <span class='diff-add'> .replace(/"/g, '\u201d')</span> <span class='diff-add'> // ellipses</span> <span class='diff-add'> .replace(/\.{3}/g, '\u2026');</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Mangle Links</span> <span class='diff-add'> */</span> <span class='diff-add'>InlineLexer.prototype.mangle = function(text) {</span> <span class='diff-add'> var out = ''</span> <span class='diff-add'> , l = text.length</span> <span class='diff-add'> , i = 0</span> <span class='diff-add'> , ch;</span> <span class='diff-add'> for (; i < l; i++) {</span> <span class='diff-add'> ch = text.charCodeAt(i);</span> <span class='diff-add'> if (Math.random() > 0.5) {</span> <span class='diff-add'> ch = 'x' + ch.toString(16);</span> <span class='diff-add'> }</span> <span class='diff-add'> out += '&#' + ch + ';';</span> <span class='diff-add'> }</span> <span class='diff-add'> return out;</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Renderer</span> <span class='diff-add'> */</span> <span class='diff-add'>function Renderer(options) {</span> <span class='diff-add'> this.options = options || {};</span> <span class='diff-add'>}</span> <span class='diff-add'>Renderer.prototype.code = function(code, lang, escaped) {</span> <span class='diff-add'> if (this.options.highlight) {</span> <span class='diff-add'> var out = this.options.highlight(code, lang);</span> <span class='diff-add'> if (out != null && out !== code) {</span> <span class='diff-add'> escaped = true;</span> <span class='diff-add'> code = out;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!lang) {</span> <span class='diff-add'> return '<pre><code>'</span> <span class='diff-add'> + (escaped ? code : escape(code, true))</span> <span class='diff-add'> + '\n</code></pre>';</span> <span class='diff-add'> }</span> <span class='diff-add'> return '<pre><code class="'</span> <span class='diff-add'> + this.options.langPrefix</span> <span class='diff-add'> + escape(lang, true)</span> <span class='diff-add'> + '">'</span> <span class='diff-add'> + (escaped ? code : escape(code, true))</span> <span class='diff-add'> + '\n</code></pre>\n';</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.blockquote = function(quote) {</span> <span class='diff-add'> return '<blockquote>\n' + quote + '</blockquote>\n';</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.html = function(html) {</span> <span class='diff-add'> return html;</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.heading = function(text, level, raw) {</span> <span class='diff-add'> return '<h'</span> <span class='diff-add'> + level</span> <span class='diff-add'> + ' id="'</span> <span class='diff-add'> + this.options.headerPrefix</span> <span class='diff-add'> + raw.toLowerCase().replace(/[^\w]+/g, '-')</span> <span class='diff-add'> + '">'</span> <span class='diff-add'> + text</span> <span class='diff-add'> + '</h'</span> <span class='diff-add'> + level</span> <span class='diff-add'> + '>\n';</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.hr = function() {</span> <span class='diff-add'> return this.options.xhtml ? '<hr/>\n' : '<hr>\n';</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.list = function(body, ordered) {</span> <span class='diff-add'> var type = ordered ? 'ol' : 'ul';</span> <span class='diff-add'> return '<' + type + '>\n' + body + '</' + type + '>\n';</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.listitem = function(text) {</span> <span class='diff-add'> return '<li>' + text + '</li>\n';</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.paragraph = function(text) {</span> <span class='diff-add'> return '<p>' + text + '</p>\n';</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.table = function(header, body) {</span> <span class='diff-add'> return '<table>\n'</span> <span class='diff-add'> + '<thead>\n'</span> <span class='diff-add'> + header</span> <span class='diff-add'> + '</thead>\n'</span> <span class='diff-add'> + '<tbody>\n'</span> <span class='diff-add'> + body</span> <span class='diff-add'> + '</tbody>\n'</span> <span class='diff-add'> + '</table>\n';</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.tablerow = function(content) {</span> <span class='diff-add'> return '<tr>\n' + content + '</tr>\n';</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.tablecell = function(content, flags) {</span> <span class='diff-add'> var type = flags.header ? 'th' : 'td';</span> <span class='diff-add'> var tag = flags.align</span> <span class='diff-add'> ? '<' + type + ' style="text-align:' + flags.align + '">'</span> <span class='diff-add'> : '<' + type + '>';</span> <span class='diff-add'> return tag + content + '</' + type + '>\n';</span> <span class='diff-add'>};</span> <span class='diff-add'>// span level renderer</span> <span class='diff-add'>Renderer.prototype.strong = function(text) {</span> <span class='diff-add'> return '<strong>' + text + '</strong>';</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.em = function(text) {</span> <span class='diff-add'> return '<em>' + text + '</em>';</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.codespan = function(text) {</span> <span class='diff-add'> return '<code>' + text + '</code>';</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.br = function() {</span> <span class='diff-add'> return this.options.xhtml ? '<br/>' : '<br>';</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.del = function(text) {</span> <span class='diff-add'> return '<del>' + text + '</del>';</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.link = function(href, title, text) {</span> <span class='diff-add'> if (this.options.sanitize) {</span> <span class='diff-add'> try {</span> <span class='diff-add'> var prot = decodeURIComponent(unescape(href))</span> <span class='diff-add'> .replace(/[^\w:]/g, '')</span> <span class='diff-add'> .toLowerCase();</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> return '';</span> <span class='diff-add'> }</span> <span class='diff-add'> if (prot.indexOf('javascript:') === 0) {</span> <span class='diff-add'> return '';</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> var out = '<a href="' + href + '"';</span> <span class='diff-add'> if (title) {</span> <span class='diff-add'> out += ' title="' + title + '"';</span> <span class='diff-add'> }</span> <span class='diff-add'> out += '>' + text + '</a>';</span> <span class='diff-add'> return out;</span> <span class='diff-add'>};</span> <span class='diff-add'>Renderer.prototype.image = function(href, title, text) {</span> <span class='diff-add'> var out = '<img src="' + href + '" alt="' + text + '"';</span> <span class='diff-add'> if (title) {</span> <span class='diff-add'> out += ' title="' + title + '"';</span> <span class='diff-add'> }</span> <span class='diff-add'> out += this.options.xhtml ? '/>' : '>';</span> <span class='diff-add'> return out;</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Parsing & Compiling</span> <span class='diff-add'> */</span> <span class='diff-add'>function Parser(options) {</span> <span class='diff-add'> this.tokens = [];</span> <span class='diff-add'> this.token = null;</span> <span class='diff-add'> this.options = options || marked.defaults;</span> <span class='diff-add'> this.options.renderer = this.options.renderer || new Renderer;</span> <span class='diff-add'> this.renderer = this.options.renderer;</span> <span class='diff-add'> this.renderer.options = this.options;</span> <span class='diff-add'>}</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Static Parse Method</span> <span class='diff-add'> */</span> <span class='diff-add'>Parser.parse = function(src, options, renderer) {</span> <span class='diff-add'> var parser = new Parser(options, renderer);</span> <span class='diff-add'> return parser.parse(src);</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Parse Loop</span> <span class='diff-add'> */</span> <span class='diff-add'>Parser.prototype.parse = function(src) {</span> <span class='diff-add'> this.inline = new InlineLexer(src.links, this.options, this.renderer);</span> <span class='diff-add'> this.tokens = src.reverse();</span> <span class='diff-add'> var out = '';</span> <span class='diff-add'> while (this.next()) {</span> <span class='diff-add'> out += this.tok();</span> <span class='diff-add'> }</span> <span class='diff-add'> return out;</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Next Token</span> <span class='diff-add'> */</span> <span class='diff-add'>Parser.prototype.next = function() {</span> <span class='diff-add'> return this.token = this.tokens.pop();</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Preview Next Token</span> <span class='diff-add'> */</span> <span class='diff-add'>Parser.prototype.peek = function() {</span> <span class='diff-add'> return this.tokens[this.tokens.length - 1] || 0;</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Parse Text Tokens</span> <span class='diff-add'> */</span> <span class='diff-add'>Parser.prototype.parseText = function() {</span> <span class='diff-add'> var body = this.token.text;</span> <span class='diff-add'> while (this.peek().type === 'text') {</span> <span class='diff-add'> body += '\n' + this.next().text;</span> <span class='diff-add'> }</span> <span class='diff-add'> return this.inline.output(body);</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Parse Current Token</span> <span class='diff-add'> */</span> <span class='diff-add'>Parser.prototype.tok = function() {</span> <span class='diff-add'> switch (this.token.type) {</span> <span class='diff-add'> case 'space': {</span> <span class='diff-add'> return '';</span> <span class='diff-add'> }</span> <span class='diff-add'> case 'hr': {</span> <span class='diff-add'> return this.renderer.hr();</span> <span class='diff-add'> }</span> <span class='diff-add'> case 'heading': {</span> <span class='diff-add'> return this.renderer.heading(</span> <span class='diff-add'> this.inline.output(this.token.text),</span> <span class='diff-add'> this.token.depth,</span> <span class='diff-add'> this.token.text);</span> <span class='diff-add'> }</span> <span class='diff-add'> case 'code': {</span> <span class='diff-add'> return this.renderer.code(this.token.text,</span> <span class='diff-add'> this.token.lang,</span> <span class='diff-add'> this.token.escaped);</span> <span class='diff-add'> }</span> <span class='diff-add'> case 'table': {</span> <span class='diff-add'> var header = ''</span> <span class='diff-add'> , body = ''</span> <span class='diff-add'> , i</span> <span class='diff-add'> , row</span> <span class='diff-add'> , cell</span> <span class='diff-add'> , flags</span> <span class='diff-add'> , j;</span> <span class='diff-add'> // header</span> <span class='diff-add'> cell = '';</span> <span class='diff-add'> for (i = 0; i < this.token.header.length; i++) {</span> <span class='diff-add'> flags = { header: true, align: this.token.align[i] };</span> <span class='diff-add'> cell += this.renderer.tablecell(</span> <span class='diff-add'> this.inline.output(this.token.header[i]),</span> <span class='diff-add'> { header: true, align: this.token.align[i] }</span> <span class='diff-add'> );</span> <span class='diff-add'> }</span> <span class='diff-add'> header += this.renderer.tablerow(cell);</span> <span class='diff-add'> for (i = 0; i < this.token.cells.length; i++) {</span> <span class='diff-add'> row = this.token.cells[i];</span> <span class='diff-add'> cell = '';</span> <span class='diff-add'> for (j = 0; j < row.length; j++) {</span> <span class='diff-add'> cell += this.renderer.tablecell(</span> <span class='diff-add'> this.inline.output(row[j]),</span> <span class='diff-add'> { header: false, align: this.token.align[j] }</span> <span class='diff-add'> );</span> <span class='diff-add'> }</span> <span class='diff-add'> body += this.renderer.tablerow(cell);</span> <span class='diff-add'> }</span> <span class='diff-add'> return this.renderer.table(header, body);</span> <span class='diff-add'> }</span> <span class='diff-add'> case 'blockquote_start': {</span> <span class='diff-add'> var body = '';</span> <span class='diff-add'> while (this.next().type !== 'blockquote_end') {</span> <span class='diff-add'> body += this.tok();</span> <span class='diff-add'> }</span> <span class='diff-add'> return this.renderer.blockquote(body);</span> <span class='diff-add'> }</span> <span class='diff-add'> case 'list_start': {</span> <span class='diff-add'> var body = ''</span> <span class='diff-add'> , ordered = this.token.ordered;</span> <span class='diff-add'> while (this.next().type !== 'list_end') {</span> <span class='diff-add'> body += this.tok();</span> <span class='diff-add'> }</span> <span class='diff-add'> return this.renderer.list(body, ordered);</span> <span class='diff-add'> }</span> <span class='diff-add'> case 'list_item_start': {</span> <span class='diff-add'> var body = '';</span> <span class='diff-add'> while (this.next().type !== 'list_item_end') {</span> <span class='diff-add'> body += this.token.type === 'text'</span> <span class='diff-add'> ? this.parseText()</span> <span class='diff-add'> : this.tok();</span> <span class='diff-add'> }</span> <span class='diff-add'> return this.renderer.listitem(body);</span> <span class='diff-add'> }</span> <span class='diff-add'> case 'loose_item_start': {</span> <span class='diff-add'> var body = '';</span> <span class='diff-add'> while (this.next().type !== 'list_item_end') {</span> <span class='diff-add'> body += this.tok();</span> <span class='diff-add'> }</span> <span class='diff-add'> return this.renderer.listitem(body);</span> <span class='diff-add'> }</span> <span class='diff-add'> case 'html': {</span> <span class='diff-add'> var html = !this.token.pre && !this.options.pedantic</span> <span class='diff-add'> ? this.inline.output(this.token.text)</span> <span class='diff-add'> : this.token.text;</span> <span class='diff-add'> return this.renderer.html(html);</span> <span class='diff-add'> }</span> <span class='diff-add'> case 'paragraph': {</span> <span class='diff-add'> return this.renderer.paragraph(this.inline.output(this.token.text));</span> <span class='diff-add'> }</span> <span class='diff-add'> case 'text': {</span> <span class='diff-add'> return this.renderer.paragraph(this.parseText());</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Helpers</span> <span class='diff-add'> */</span> <span class='diff-add'>function escape(html, encode) {</span> <span class='diff-add'> return html</span> <span class='diff-add'> .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&')</span> <span class='diff-add'> .replace(/</g, '<')</span> <span class='diff-add'> .replace(/>/g, '>')</span> <span class='diff-add'> .replace(/"/g, '"')</span> <span class='diff-add'> .replace(/'/g, ''');</span> <span class='diff-add'>}</span> <span class='diff-add'>function unescape(html) {</span> <span class='diff-add'> return html.replace(/&([#\w]+);/g, function(_, n) {</span> <span class='diff-add'> n = n.toLowerCase();</span> <span class='diff-add'> if (n === 'colon') return ':';</span> <span class='diff-add'> if (n.charAt(0) === '#') {</span> <span class='diff-add'> return n.charAt(1) === 'x'</span> <span class='diff-add'> ? String.fromCharCode(parseInt(n.substring(2), 16))</span> <span class='diff-add'> : String.fromCharCode(+n.substring(1));</span> <span class='diff-add'> }</span> <span class='diff-add'> return '';</span> <span class='diff-add'> });</span> <span class='diff-add'>}</span> <span class='diff-add'>function replace(regex, opt) {</span> <span class='diff-add'> regex = regex.source;</span> <span class='diff-add'> opt = opt || '';</span> <span class='diff-add'> return function self(name, val) {</span> <span class='diff-add'> if (!name) return new RegExp(regex, opt);</span> <span class='diff-add'> val = val.source || val;</span> <span class='diff-add'> val = val.replace(/(^|[^\[])\^/g, '$1');</span> <span class='diff-add'> regex = regex.replace(name, val);</span> <span class='diff-add'> return self;</span> <span class='diff-add'> };</span> <span class='diff-add'>}</span> <span class='diff-add'>function noop() {}</span> <span class='diff-add'>noop.exec = noop;</span> <span class='diff-add'>function merge(obj) {</span> <span class='diff-add'> var i = 1</span> <span class='diff-add'> , target</span> <span class='diff-add'> , key;</span> <span class='diff-add'> for (; i < arguments.length; i++) {</span> <span class='diff-add'> target = arguments[i];</span> <span class='diff-add'> for (key in target) {</span> <span class='diff-add'> if (Object.prototype.hasOwnProperty.call(target, key)) {</span> <span class='diff-add'> obj[key] = target[key];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return obj;</span> <span class='diff-add'>}</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Marked</span> <span class='diff-add'> */</span> <span class='diff-add'>function marked(src, opt, callback) {</span> <span class='diff-add'> if (callback || typeof opt === 'function') {</span> <span class='diff-add'> if (!callback) {</span> <span class='diff-add'> callback = opt;</span> <span class='diff-add'> opt = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> opt = merge({}, marked.defaults, opt || {});</span> <span class='diff-add'> var highlight = opt.highlight</span> <span class='diff-add'> , tokens</span> <span class='diff-add'> , pending</span> <span class='diff-add'> , i = 0;</span> <span class='diff-add'> try {</span> <span class='diff-add'> tokens = Lexer.lex(src, opt)</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> return callback(e);</span> <span class='diff-add'> }</span> <span class='diff-add'> pending = tokens.length;</span> <span class='diff-add'> var done = function() {</span> <span class='diff-add'> var out, err;</span> <span class='diff-add'> try {</span> <span class='diff-add'> out = Parser.parse(tokens, opt);</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> err = e;</span> <span class='diff-add'> }</span> <span class='diff-add'> opt.highlight = highlight;</span> <span class='diff-add'> return err</span> <span class='diff-add'> ? callback(err)</span> <span class='diff-add'> : callback(null, out);</span> <span class='diff-add'> };</span> <span class='diff-add'> if (!highlight || highlight.length < 3) {</span> <span class='diff-add'> return done();</span> <span class='diff-add'> }</span> <span class='diff-add'> delete opt.highlight;</span> <span class='diff-add'> if (!pending) return done();</span> <span class='diff-add'> for (; i < tokens.length; i++) {</span> <span class='diff-add'> (function(token) {</span> <span class='diff-add'> if (token.type !== 'code') {</span> <span class='diff-add'> return --pending || done();</span> <span class='diff-add'> }</span> <span class='diff-add'> return highlight(token.text, token.lang, function(err, code) {</span> <span class='diff-add'> if (code == null || code === token.text) {</span> <span class='diff-add'> return --pending || done();</span> <span class='diff-add'> }</span> <span class='diff-add'> token.text = code;</span> <span class='diff-add'> token.escaped = true;</span> <span class='diff-add'> --pending || done();</span> <span class='diff-add'> });</span> <span class='diff-add'> })(tokens[i]);</span> <span class='diff-add'> }</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> try {</span> <span class='diff-add'> if (opt) opt = merge({}, marked.defaults, opt);</span> <span class='diff-add'> return Parser.parse(Lexer.lex(src, opt), opt);</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> e.message += '\nPlease report this to https://github.com/chjj/marked.';</span> <span class='diff-add'> if ((opt || marked.defaults).silent) {</span> <span class='diff-add'> return '<p>An error occured:</p><pre>'</span> <span class='diff-add'> + escape(e.message + '', true)</span> <span class='diff-add'> + '</pre>';</span> <span class='diff-add'> }</span> <span class='diff-add'> throw e;</span> <span class='diff-add'> }</span> <span class='diff-add'>}</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Options</span> <span class='diff-add'> */</span> <span class='diff-add'>marked.options =</span> <span class='diff-add'>marked.setOptions = function(opt) {</span> <span class='diff-add'> merge(marked.defaults, opt);</span> <span class='diff-add'> return marked;</span> <span class='diff-add'>};</span> <span class='diff-add'>marked.defaults = {</span> <span class='diff-add'> gfm: true,</span> <span class='diff-add'> tables: true,</span> <span class='diff-add'> breaks: false,</span> <span class='diff-add'> pedantic: false,</span> <span class='diff-add'> sanitize: false,</span> <span class='diff-add'> smartLists: false,</span> <span class='diff-add'> silent: false,</span> <span class='diff-add'> highlight: null,</span> <span class='diff-add'> langPrefix: 'lang-',</span> <span class='diff-add'> smartypants: false,</span> <span class='diff-add'> headerPrefix: '',</span> <span class='diff-add'> renderer: new Renderer,</span> <span class='diff-add'> xhtml: false</span> <span class='diff-add'>};</span> <span class='diff-add'>/**</span> <span class='diff-add'> * Expose</span> <span class='diff-add'> */</span> <span class='diff-add'>marked.Parser = Parser;</span> <span class='diff-add'>marked.parser = Parser.parse;</span> <span class='diff-add'>marked.Renderer = Renderer;</span> <span class='diff-add'>marked.Lexer = Lexer;</span> <span class='diff-add'>marked.lexer = Lexer.lex;</span> <span class='diff-add'>marked.InlineLexer = InlineLexer;</span> <span class='diff-add'>marked.inlineLexer = InlineLexer.output;</span> <span class='diff-add'>marked.parse = marked;</span> <span class='diff-add'>if (typeof exports === 'object') {</span> <span class='diff-add'> module.exports = marked;</span> <span class='diff-add'>} else if (typeof define === 'function' && define.amd) {</span> <span class='diff-add'> define(function() { return marked; });</span> <span class='diff-add'>} else {</span> <span class='diff-add'> this.marked = marked;</span> <span class='diff-add'>}</span> <span class='diff-add'>}).call(function() {</span> <span class='diff-add'> return this || (typeof window !== 'undefined' ? window : global);</span> <span class='diff-add'>}());</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/matchbrackets.js b/ipynb/Array-feature-overlap-05_files/matchbrackets.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..fa1ae03</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/matchbrackets.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span> <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span> <span class='diff-add'>(function(mod) {</span> <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span> <span class='diff-add'> mod(require("../../lib/codemirror"));</span> <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span> <span class='diff-add'> define(["../../lib/codemirror"], mod);</span> <span class='diff-add'> else // Plain browser env</span> <span class='diff-add'> mod(CodeMirror);</span> <span class='diff-add'>})(function(CodeMirror) {</span> <span class='diff-add'> var ie_lt8 = /MSIE \d/.test(navigator.userAgent) &&</span> <span class='diff-add'> (document.documentMode == null || document.documentMode < 8);</span> <span class='diff-add'> var Pos = CodeMirror.Pos;</span> <span class='diff-add'> var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"};</span> <span class='diff-add'> function findMatchingBracket(cm, where, strict, config) {</span> <span class='diff-add'> var line = cm.getLineHandle(where.line), pos = where.ch - 1;</span> <span class='diff-add'> var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];</span> <span class='diff-add'> if (!match) return null;</span> <span class='diff-add'> var dir = match.charAt(1) == ">" ? 1 : -1;</span> <span class='diff-add'> if (strict && (dir > 0) != (pos == where.ch)) return null;</span> <span class='diff-add'> var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));</span> <span class='diff-add'> var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config);</span> <span class='diff-add'> if (found == null) return null;</span> <span class='diff-add'> return {from: Pos(where.line, pos), to: found && found.pos,</span> <span class='diff-add'> match: found && found.ch == match.charAt(0), forward: dir > 0};</span> <span class='diff-add'> }</span> <span class='diff-add'> // bracketRegex is used to specify which type of bracket to scan</span> <span class='diff-add'> // should be a regexp, e.g. /[[\]]/</span> <span class='diff-add'> //</span> <span class='diff-add'> // Note: If "where" is on an open bracket, then this bracket is ignored.</span> <span class='diff-add'> //</span> <span class='diff-add'> // Returns false when no bracket was found, null when it reached</span> <span class='diff-add'> // maxScanLines and gave up</span> <span class='diff-add'> function scanForBracket(cm, where, dir, style, config) {</span> <span class='diff-add'> var maxScanLen = (config && config.maxScanLineLength) || 10000;</span> <span class='diff-add'> var maxScanLines = (config && config.maxScanLines) || 1000;</span> <span class='diff-add'> var stack = [];</span> <span class='diff-add'> var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\]]/;</span> <span class='diff-add'> var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)</span> <span class='diff-add'> : Math.max(cm.firstLine() - 1, where.line - maxScanLines);</span> <span class='diff-add'> for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {</span> <span class='diff-add'> var line = cm.getLine(lineNo);</span> <span class='diff-add'> if (!line) continue;</span> <span class='diff-add'> var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;</span> <span class='diff-add'> if (line.length > maxScanLen) continue;</span> <span class='diff-add'> if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);</span> <span class='diff-add'> for (; pos != end; pos += dir) {</span> <span class='diff-add'> var ch = line.charAt(pos);</span> <span class='diff-add'> if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) {</span> <span class='diff-add'> var match = matching[ch];</span> <span class='diff-add'> if ((match.charAt(1) == ">") == (dir > 0)) stack.push(ch);</span> <span class='diff-add'> else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};</span> <span class='diff-add'> else stack.pop();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;</span> <span class='diff-add'> }</span> <span class='diff-add'> function matchBrackets(cm, autoclear, config) {</span> <span class='diff-add'> // Disable brace matching in long lines, since it'll cause hugely slow updates</span> <span class='diff-add'> var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000;</span> <span class='diff-add'> var marks = [], ranges = cm.listSelections();</span> <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span> <span class='diff-add'> var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, false, config);</span> <span class='diff-add'> if (match && cm.getLine(match.from.line).length <= maxHighlightLen) {</span> <span class='diff-add'> var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";</span> <span class='diff-add'> marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));</span> <span class='diff-add'> if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)</span> <span class='diff-add'> marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style}));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (marks.length) {</span> <span class='diff-add'> // Kludge to work around the IE bug from issue #1193, where text</span> <span class='diff-add'> // input stops going to the textare whever this fires.</span> <span class='diff-add'> if (ie_lt8 && cm.state.focused) cm.display.input.focus();</span> <span class='diff-add'> var clear = function() {</span> <span class='diff-add'> cm.operation(function() {</span> <span class='diff-add'> for (var i = 0; i < marks.length; i++) marks[i].clear();</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> if (autoclear) setTimeout(clear, 800);</span> <span class='diff-add'> else return clear;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> var currentlyHighlighted = null;</span> <span class='diff-add'> function doMatchBrackets(cm) {</span> <span class='diff-add'> cm.operation(function() {</span> <span class='diff-add'> if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;}</span> <span class='diff-add'> currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) {</span> <span class='diff-add'> if (old && old != CodeMirror.Init)</span> <span class='diff-add'> cm.off("cursorActivity", doMatchBrackets);</span> <span class='diff-add'> if (val) {</span> <span class='diff-add'> cm.state.matchBrackets = typeof val == "object" ? val : {};</span> <span class='diff-add'> cm.on("cursorActivity", doMatchBrackets);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> CodeMirror.defineExtension("matchBrackets", function() {matchBrackets(this, true);});</span> <span class='diff-add'> CodeMirror.defineExtension("findMatchingBracket", function(pos, strict, config){</span> <span class='diff-add'> return findMatchingBracket(this, pos, strict, config);</span> <span class='diff-add'> });</span> <span class='diff-add'> CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config){</span> <span class='diff-add'> return scanForBracket(this, pos, dir, style, config);</span> <span class='diff-add'> });</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/mathjaxutils.js b/ipynb/Array-feature-overlap-05_files/mathjaxutils.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..ba5b59b</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/mathjaxutils.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> 'base/js/dialog',</span> <span class='diff-add'>], function(IPython, $, utils, dialog) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var init = function () {</span> <span class='diff-add'> if (window.MathJax) {</span> <span class='diff-add'> // MathJax loaded</span> <span class='diff-add'> MathJax.Hub.Config({</span> <span class='diff-add'> tex2jax: {</span> <span class='diff-add'> inlineMath: [ ['$','$'], ["\\(","\\)"] ],</span> <span class='diff-add'> displayMath: [ ['$$','$$'], ["\\[","\\]"] ],</span> <span class='diff-add'> processEscapes: true,</span> <span class='diff-add'> processEnvironments: true</span> <span class='diff-add'> },</span> <span class='diff-add'> // Center justify equations in code and markdown cells. Elsewhere</span> <span class='diff-add'> // we use CSS to left justify single line equations in code cells.</span> <span class='diff-add'> displayAlign: 'center',</span> <span class='diff-add'> "HTML-CSS": {</span> <span class='diff-add'> styles: {'.MathJax_Display': {"margin": 0}},</span> <span class='diff-add'> linebreaks: { automatic: true }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> MathJax.Hub.Configured();</span> <span class='diff-add'> } else if (window.mathjax_url !== "") {</span> <span class='diff-add'> // Don't have MathJax, but should. Show dialog.</span> <span class='diff-add'> var message = $('<div/>')</span> <span class='diff-add'> .append(</span> <span class='diff-add'> $("<p/></p>").addClass('dialog').text(</span> <span class='diff-add'> "Math/LaTeX rendering will be disabled."</span> <span class='diff-add'> )</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $("<p></p>").addClass('dialog').text(</span> <span class='diff-add'> "If you have administrative access to the notebook server and" +</span> <span class='diff-add'> " a working internet connection, you can install a local copy" +</span> <span class='diff-add'> " of MathJax for offline use with the following command on the server" +</span> <span class='diff-add'> " at a Python or IPython prompt:"</span> <span class='diff-add'> )</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $("<pre></pre>").addClass('dialog').text(</span> <span class='diff-add'> ">>> from IPython.external import mathjax; mathjax.install_mathjax()"</span> <span class='diff-add'> )</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $("<p></p>").addClass('dialog').text(</span> <span class='diff-add'> "This will try to install MathJax into the IPython source directory."</span> <span class='diff-add'> )</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $("<p></p>").addClass('dialog').text(</span> <span class='diff-add'> "If IPython is installed to a location that requires" +</span> <span class='diff-add'> " administrative privileges to write, you will need to make this call as" +</span> <span class='diff-add'> " an administrator, via 'sudo'."</span> <span class='diff-add'> )</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $("<p></p>").addClass('dialog').text(</span> <span class='diff-add'> "When you start the notebook server, you can instruct it to disable MathJax support altogether:"</span> <span class='diff-add'> )</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $("<pre></pre>").addClass('dialog').text(</span> <span class='diff-add'> "$ ipython notebook --no-mathjax"</span> <span class='diff-add'> )</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $("<p></p>").addClass('dialog').text(</span> <span class='diff-add'> "which will prevent this dialog from appearing."</span> <span class='diff-add'> )</span> <span class='diff-add'> );</span> <span class='diff-add'> dialog.modal({</span> <span class='diff-add'> title : "Failed to retrieve MathJax from '" + window.mathjax_url + "'",</span> <span class='diff-add'> body : message,</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> OK : {class: "btn-danger"}</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // Some magic for deferring mathematical expressions to MathJax</span> <span class='diff-add'> // by hiding them from the Markdown parser.</span> <span class='diff-add'> // Some of the code here is adapted with permission from Davide Cervone</span> <span class='diff-add'> // under the terms of the Apache2 license governing the MathJax project.</span> <span class='diff-add'> // Other minor modifications are also due to StackExchange and are used with</span> <span class='diff-add'> // permission.</span> <span class='diff-add'> var inline = "$"; // the inline math delimiter</span> <span class='diff-add'> // MATHSPLIT contains the pattern for math delimiters and special symbols</span> <span class='diff-add'> // needed for searching for math in the text input.</span> <span class='diff-add'> var MATHSPLIT = /(\$\$?|\\(?:begin|end)\{[a-z]*\*?\}|\\[\\{}$]|[{}]|(?:\n\s*)+|@@\d+@@)/i;</span> <span class='diff-add'> // The math is in blocks i through j, so</span> <span class='diff-add'> // collect it into one block and clear the others.</span> <span class='diff-add'> // Replace &, <, and > by named entities.</span> <span class='diff-add'> // For IE, put <br> at the ends of comments since IE removes \n.</span> <span class='diff-add'> // Clear the current math positions and store the index of the</span> <span class='diff-add'> // math, then push the math string onto the storage array.</span> <span class='diff-add'> // The preProcess function is called on all blocks if it has been passed in</span> <span class='diff-add'> var process_math = function (i, j, pre_process, math, blocks) {</span> <span class='diff-add'> var block = blocks.slice(i, j + 1).join("").replace(/&/g, "&") // use HTML entity for &</span> <span class='diff-add'> .replace(/</g, "<") // use HTML entity for <</span> <span class='diff-add'> .replace(/>/g, ">") // use HTML entity for ></span> <span class='diff-add'> ;</span> <span class='diff-add'> if (utils.browser === 'msie') {</span> <span class='diff-add'> block = block.replace(/(%[^\n]*)\n/g, "$1<br/>\n");</span> <span class='diff-add'> }</span> <span class='diff-add'> while (j > i) {</span> <span class='diff-add'> blocks[j] = "";</span> <span class='diff-add'> j--;</span> <span class='diff-add'> }</span> <span class='diff-add'> blocks[i] = "@@" + math.length + "@@"; // replace the current block text with a unique tag to find later</span> <span class='diff-add'> if (pre_process){</span> <span class='diff-add'> block = pre_process(block);</span> <span class='diff-add'> }</span> <span class='diff-add'> math.push(block);</span> <span class='diff-add'> return blocks;</span> <span class='diff-add'> };</span> <span class='diff-add'> // Break up the text into its component parts and search</span> <span class='diff-add'> // through them for math delimiters, braces, linebreaks, etc.</span> <span class='diff-add'> // Math delimiters must match and braces must balance.</span> <span class='diff-add'> // Don't allow math to pass through a double linebreak</span> <span class='diff-add'> // (which will be a paragraph).</span> <span class='diff-add'> //</span> <span class='diff-add'> var remove_math = function (text) {</span> <span class='diff-add'> var math = []; // stores math strings for later</span> <span class='diff-add'> var start;</span> <span class='diff-add'> var end;</span> <span class='diff-add'> var last;</span> <span class='diff-add'> var braces;</span> <span class='diff-add'> // Except for extreme edge cases, this should catch precisely those pieces of the markdown</span> <span class='diff-add'> // source that will later be turned into code spans. While MathJax will not TeXify code spans,</span> <span class='diff-add'> // we still have to consider them at this point; the following issue has happened several times:</span> <span class='diff-add'> //</span> <span class='diff-add'> // `$foo` and `$bar` are varibales. --> <code>$foo ` and `$bar</code> are variables.</span> <span class='diff-add'> var hasCodeSpans = /`/.test(text),</span> <span class='diff-add'> de_tilde;</span> <span class='diff-add'> if (hasCodeSpans) {</span> <span class='diff-add'> text = text.replace(/~/g, "~T").replace(/(^|[^\\])(`+)([^\n]*?[^`\n])\2(?!`)/gm, function (wholematch) {</span> <span class='diff-add'> return wholematch.replace(/\$/g, "~D");</span> <span class='diff-add'> });</span> <span class='diff-add'> de_tilde = function (text) {</span> <span class='diff-add'> return text.replace(/~([TD])/g, function (wholematch, character) {</span> <span class='diff-add'> return { T: "~", D: "$" }[character];</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> } else {</span> <span class='diff-add'> de_tilde = function (text) { return text; };</span> <span class='diff-add'> }</span> <span class='diff-add'> var blocks = utils.regex_split(text.replace(/\r\n?/g, "\n"),MATHSPLIT);</span> <span class='diff-add'> for (var i = 1, m = blocks.length; i < m; i += 2) {</span> <span class='diff-add'> var block = blocks[i];</span> <span class='diff-add'> if (block.charAt(0) === "@") {</span> <span class='diff-add'> //</span> <span class='diff-add'> // Things that look like our math markers will get</span> <span class='diff-add'> // stored and then retrieved along with the math.</span> <span class='diff-add'> //</span> <span class='diff-add'> blocks[i] = "@@" + math.length + "@@";</span> <span class='diff-add'> math.push(block);</span> <span class='diff-add'> }</span> <span class='diff-add'> else if (start) {</span> <span class='diff-add'> //</span> <span class='diff-add'> // If we are in math, look for the end delimiter,</span> <span class='diff-add'> // but don't go past double line breaks, and</span> <span class='diff-add'> // and balance braces within the math.</span> <span class='diff-add'> //</span> <span class='diff-add'> if (block === end) {</span> <span class='diff-add'> if (braces) {</span> <span class='diff-add'> last = i;</span> <span class='diff-add'> }</span> <span class='diff-add'> else {</span> <span class='diff-add'> blocks = process_math(start, i, de_tilde, math, blocks);</span> <span class='diff-add'> start = null;</span> <span class='diff-add'> end = null;</span> <span class='diff-add'> last = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> else if (block.match(/\n.*\n/)) {</span> <span class='diff-add'> if (last) {</span> <span class='diff-add'> i = last;</span> <span class='diff-add'> blocks = process_math(start, i, de_tilde, math, blocks);</span> <span class='diff-add'> }</span> <span class='diff-add'> start = null;</span> <span class='diff-add'> end = null;</span> <span class='diff-add'> last = null;</span> <span class='diff-add'> braces = 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> else if (block === "{") {</span> <span class='diff-add'> braces++;</span> <span class='diff-add'> }</span> <span class='diff-add'> else if (block === "}" && braces) {</span> <span class='diff-add'> braces--;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> else {</span> <span class='diff-add'> //</span> <span class='diff-add'> // Look for math start delimiters and when</span> <span class='diff-add'> // found, set up the end delimiter.</span> <span class='diff-add'> //</span> <span class='diff-add'> if (block === inline || block === "$$") {</span> <span class='diff-add'> start = i;</span> <span class='diff-add'> end = block;</span> <span class='diff-add'> braces = 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> else if (block.substr(1, 5) === "begin") {</span> <span class='diff-add'> start = i;</span> <span class='diff-add'> end = "\\end" + block.substr(6);</span> <span class='diff-add'> braces = 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (last) {</span> <span class='diff-add'> blocks = process_math(start, last, de_tilde, math, blocks);</span> <span class='diff-add'> start = null;</span> <span class='diff-add'> end = null;</span> <span class='diff-add'> last = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> return [de_tilde(blocks.join("")), math];</span> <span class='diff-add'> };</span> <span class='diff-add'> //</span> <span class='diff-add'> // Put back the math strings that were saved,</span> <span class='diff-add'> // and clear the math array (no need to keep it around).</span> <span class='diff-add'> //</span> <span class='diff-add'> var replace_math = function (text, math) {</span> <span class='diff-add'> text = text.replace(/@@(\d+)@@/g, function (match, n) {</span> <span class='diff-add'> return math[n];</span> <span class='diff-add'> });</span> <span class='diff-add'> return text;</span> <span class='diff-add'> };</span> <span class='diff-add'> var mathjaxutils = {</span> <span class='diff-add'> init : init,</span> <span class='diff-add'> remove_math : remove_math,</span> <span class='diff-add'> replace_math : replace_math</span> <span class='diff-add'> };</span> <span class='diff-add'> IPython.mathjaxutils = mathjaxutils;</span> <span class='diff-add'> return mathjaxutils;</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/menubar.js b/ipynb/Array-feature-overlap-05_files/menubar.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..24464fd</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/menubar.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'base/js/dialog',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> 'notebook/js/tour',</span> <span class='diff-add'> 'bootstrap',</span> <span class='diff-add'> 'moment',</span> <span class='diff-add'>], function($, IPython, dialog, utils, tour, bootstrap, moment) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> </span> <span class='diff-add'> var MenuBar = function (selector, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Constructor</span> <span class='diff-add'> *</span> <span class='diff-add'> * A MenuBar Class to generate the menubar of IPython notebook</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters:</span> <span class='diff-add'> * selector: string</span> <span class='diff-add'> * options: dictionary</span> <span class='diff-add'> * Dictionary of keyword arguments.</span> <span class='diff-add'> * notebook: Notebook instance</span> <span class='diff-add'> * contents: ContentManager instance</span> <span class='diff-add'> * events: $(Events) instance</span> <span class='diff-add'> * save_widget: SaveWidget instance</span> <span class='diff-add'> * quick_help: QuickHelp instance</span> <span class='diff-add'> * base_url : string</span> <span class='diff-add'> * notebook_path : string</span> <span class='diff-add'> * notebook_name : string</span> <span class='diff-add'> */</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> this.base_url = options.base_url || utils.get_body_data("baseUrl");</span> <span class='diff-add'> this.selector = selector;</span> <span class='diff-add'> this.notebook = options.notebook;</span> <span class='diff-add'> this.contents = options.contents;</span> <span class='diff-add'> this.events = options.events;</span> <span class='diff-add'> this.save_widget = options.save_widget;</span> <span class='diff-add'> this.quick_help = options.quick_help;</span> <span class='diff-add'> try {</span> <span class='diff-add'> this.tour = new tour.Tour(this.notebook, this.events);</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> this.tour = undefined;</span> <span class='diff-add'> console.log("Failed to instantiate Notebook Tour", e);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.selector !== undefined) {</span> <span class='diff-add'> this.element = $(selector);</span> <span class='diff-add'> this.style();</span> <span class='diff-add'> this.bind_events();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // TODO: This has definitively nothing to do with style ...</span> <span class='diff-add'> MenuBar.prototype.style = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.element.find("li").click(function (event, ui) {</span> <span class='diff-add'> // The selected cell loses focus when the menu is entered, so we</span> <span class='diff-add'> // re-select it upon selection.</span> <span class='diff-add'> var i = that.notebook.get_selected_index();</span> <span class='diff-add'> that.notebook.select(i);</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> MenuBar.prototype._nbconvert = function (format, download) {</span> <span class='diff-add'> download = download || false;</span> <span class='diff-add'> var notebook_path = this.notebook.notebook_path;</span> <span class='diff-add'> var url = utils.url_join_encode(</span> <span class='diff-add'> this.base_url,</span> <span class='diff-add'> 'nbconvert',</span> <span class='diff-add'> format,</span> <span class='diff-add'> notebook_path</span> <span class='diff-add'> ) + "?download=" + download.toString();</span> <span class='diff-add'> </span> <span class='diff-add'> var w = window.open(undefined, IPython._target);</span> <span class='diff-add'> if (this.notebook.dirty) {</span> <span class='diff-add'> this.notebook.save_notebook().then(function() {</span> <span class='diff-add'> w.location = url;</span> <span class='diff-add'> });</span> <span class='diff-add'> } else {</span> <span class='diff-add'> w.location = url;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> MenuBar.prototype._size_header = function() {</span> <span class='diff-add'> /** </span> <span class='diff-add'> * Update header spacer size.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.events.trigger('resize-header.Page');</span> <span class='diff-add'> };</span> <span class='diff-add'> MenuBar.prototype.bind_events = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * File</span> <span class='diff-add'> */</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> </span> <span class='diff-add'> this.element.find('#open_notebook').click(function () {</span> <span class='diff-add'> var parent = utils.url_path_split(that.notebook.notebook_path)[0];</span> <span class='diff-add'> window.open(utils.url_join_encode(that.base_url, 'tree', parent), IPython._target);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#copy_notebook').click(function () {</span> <span class='diff-add'> that.notebook.copy_notebook();</span> <span class='diff-add'> return false;</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#download_ipynb').click(function () {</span> <span class='diff-add'> var base_url = that.notebook.base_url;</span> <span class='diff-add'> var notebook_path = that.notebook.notebook_path;</span> <span class='diff-add'> if (that.notebook.dirty) {</span> <span class='diff-add'> that.notebook.save_notebook({async : false});</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> var url = utils.url_join_encode(base_url, 'files', notebook_path);</span> <span class='diff-add'> window.open(url + '?download=1');</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> this.element.find('#print_preview').click(function () {</span> <span class='diff-add'> that._nbconvert('html', false);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#download_html').click(function () {</span> <span class='diff-add'> that._nbconvert('html', true);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#download_rst').click(function () {</span> <span class='diff-add'> that._nbconvert('rst', true);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#download_pdf').click(function () {</span> <span class='diff-add'> that._nbconvert('pdf', true);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#download_script').click(function () {</span> <span class='diff-add'> that._nbconvert('script', true);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#rename_notebook').click(function () {</span> <span class='diff-add'> that.save_widget.rename_notebook({notebook: that.notebook});</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#save_checkpoint').click(function () {</span> <span class='diff-add'> that.notebook.save_checkpoint();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#restore_checkpoint').click(function () {</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#trust_notebook').click(function () {</span> <span class='diff-add'> that.notebook.trust_notebook();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('trust_changed.Notebook', function (event, trusted) {</span> <span class='diff-add'> if (trusted) {</span> <span class='diff-add'> that.element.find('#trust_notebook')</span> <span class='diff-add'> .addClass("disabled").off('click')</span> <span class='diff-add'> .find("a").text("Trusted Notebook");</span> <span class='diff-add'> } else {</span> <span class='diff-add'> that.element.find('#trust_notebook')</span> <span class='diff-add'> .removeClass("disabled").on('click', function () {</span> <span class='diff-add'> that.notebook.trust_notebook();</span> <span class='diff-add'> })</span> <span class='diff-add'> .find("a").text("Trust Notebook");</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#kill_and_exit').click(function () {</span> <span class='diff-add'> var close_window = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * allow closing of new tabs in Chromium, impossible in FF</span> <span class='diff-add'> */</span> <span class='diff-add'> window.open('', '_self', '');</span> <span class='diff-add'> window.close();</span> <span class='diff-add'> };</span> <span class='diff-add'> // finish with close on success or failure</span> <span class='diff-add'> that.notebook.session.delete(close_window, close_window);</span> <span class='diff-add'> });</span> <span class='diff-add'> // Edit</span> <span class='diff-add'> this.element.find('#cut_cell').click(function () {</span> <span class='diff-add'> that.notebook.cut_cell();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#copy_cell').click(function () {</span> <span class='diff-add'> that.notebook.copy_cell();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#delete_cell').click(function () {</span> <span class='diff-add'> that.notebook.delete_cell();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#undelete_cell').click(function () {</span> <span class='diff-add'> that.notebook.undelete_cell();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#split_cell').click(function () {</span> <span class='diff-add'> that.notebook.split_cell();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#merge_cell_above').click(function () {</span> <span class='diff-add'> that.notebook.merge_cell_above();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#merge_cell_below').click(function () {</span> <span class='diff-add'> that.notebook.merge_cell_below();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#move_cell_up').click(function () {</span> <span class='diff-add'> that.notebook.move_cell_up();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#move_cell_down').click(function () {</span> <span class='diff-add'> that.notebook.move_cell_down();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#edit_nb_metadata').click(function () {</span> <span class='diff-add'> that.notebook.edit_metadata({</span> <span class='diff-add'> notebook: that.notebook,</span> <span class='diff-add'> keyboard_manager: that.notebook.keyboard_manager});</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> // View</span> <span class='diff-add'> this.element.find('#toggle_header').click(function () {</span> <span class='diff-add'> $('#header-container').toggle();</span> <span class='diff-add'> $('.header-bar').toggle();</span> <span class='diff-add'> that._size_header();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#toggle_toolbar').click(function () {</span> <span class='diff-add'> $('div#maintoolbar').toggle();</span> <span class='diff-add'> that._size_header();</span> <span class='diff-add'> });</span> <span class='diff-add'> // Insert</span> <span class='diff-add'> this.element.find('#insert_cell_above').click(function () {</span> <span class='diff-add'> that.notebook.insert_cell_above('code');</span> <span class='diff-add'> that.notebook.select_prev();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#insert_cell_below').click(function () {</span> <span class='diff-add'> that.notebook.insert_cell_below('code');</span> <span class='diff-add'> that.notebook.select_next();</span> <span class='diff-add'> });</span> <span class='diff-add'> // Cell</span> <span class='diff-add'> this.element.find('#run_cell').click(function () {</span> <span class='diff-add'> that.notebook.execute_cell();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#run_cell_select_below').click(function () {</span> <span class='diff-add'> that.notebook.execute_cell_and_select_below();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#run_cell_insert_below').click(function () {</span> <span class='diff-add'> that.notebook.execute_cell_and_insert_below();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#run_all_cells').click(function () {</span> <span class='diff-add'> that.notebook.execute_all_cells();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#run_all_cells_above').click(function () {</span> <span class='diff-add'> that.notebook.execute_cells_above();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#run_all_cells_below').click(function () {</span> <span class='diff-add'> that.notebook.execute_cells_below();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#to_code').click(function () {</span> <span class='diff-add'> that.notebook.to_code();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#to_markdown').click(function () {</span> <span class='diff-add'> that.notebook.to_markdown();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#to_raw').click(function () {</span> <span class='diff-add'> that.notebook.to_raw();</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> this.element.find('#toggle_current_output').click(function () {</span> <span class='diff-add'> that.notebook.toggle_output();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#toggle_current_output_scroll').click(function () {</span> <span class='diff-add'> that.notebook.toggle_output_scroll();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#clear_current_output').click(function () {</span> <span class='diff-add'> that.notebook.clear_output();</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> this.element.find('#toggle_all_output').click(function () {</span> <span class='diff-add'> that.notebook.toggle_all_output();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#toggle_all_output_scroll').click(function () {</span> <span class='diff-add'> that.notebook.toggle_all_output_scroll();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#clear_all_output').click(function () {</span> <span class='diff-add'> that.notebook.clear_all_output();</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> // Kernel</span> <span class='diff-add'> this.element.find('#int_kernel').click(function () {</span> <span class='diff-add'> that.notebook.kernel.interrupt();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#restart_kernel').click(function () {</span> <span class='diff-add'> that.notebook.restart_kernel();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.find('#reconnect_kernel').click(function () {</span> <span class='diff-add'> that.notebook.kernel.reconnect();</span> <span class='diff-add'> });</span> <span class='diff-add'> // Help</span> <span class='diff-add'> if (this.tour) {</span> <span class='diff-add'> this.element.find('#notebook_tour').click(function () {</span> <span class='diff-add'> that.tour.start();</span> <span class='diff-add'> });</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.element.find('#notebook_tour').addClass("disabled");</span> <span class='diff-add'> }</span> <span class='diff-add'> this.element.find('#keyboard_shortcuts').click(function () {</span> <span class='diff-add'> that.quick_help.show_keyboard_shortcuts();</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> this.update_restore_checkpoint(null);</span> <span class='diff-add'> </span> <span class='diff-add'> this.events.on('checkpoints_listed.Notebook', function (event, data) {</span> <span class='diff-add'> that.update_restore_checkpoint(that.notebook.checkpoints);</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> this.events.on('checkpoint_created.Notebook', function (event, data) {</span> <span class='diff-add'> that.update_restore_checkpoint(that.notebook.checkpoints);</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> this.events.on('notebook_loaded.Notebook', function() {</span> <span class='diff-add'> var langinfo = that.notebook.metadata.language_info || {};</span> <span class='diff-add'> that.update_nbconvert_script(langinfo);</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> this.events.on('kernel_ready.Kernel', function(event, data) {</span> <span class='diff-add'> var langinfo = data.kernel.info_reply.language_info || {};</span> <span class='diff-add'> that.update_nbconvert_script(langinfo);</span> <span class='diff-add'> that.add_kernel_help_links(data.kernel.info_reply.help_links || []);</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> MenuBar.prototype.update_restore_checkpoint = function(checkpoints) {</span> <span class='diff-add'> var ul = this.element.find("#restore_checkpoint").find("ul");</span> <span class='diff-add'> ul.empty();</span> <span class='diff-add'> if (!checkpoints || checkpoints.length === 0) {</span> <span class='diff-add'> ul.append(</span> <span class='diff-add'> $("<li/>")</span> <span class='diff-add'> .addClass("disabled")</span> <span class='diff-add'> .append(</span> <span class='diff-add'> $("<a/>")</span> <span class='diff-add'> .text("No checkpoints")</span> <span class='diff-add'> )</span> <span class='diff-add'> );</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> checkpoints.map(function (checkpoint) {</span> <span class='diff-add'> var d = new Date(checkpoint.last_modified);</span> <span class='diff-add'> ul.append(</span> <span class='diff-add'> $("<li/>").append(</span> <span class='diff-add'> $("<a/>")</span> <span class='diff-add'> .attr("href", "#")</span> <span class='diff-add'> .text(moment(d).format("LLLL"))</span> <span class='diff-add'> .click(function () {</span> <span class='diff-add'> that.notebook.restore_checkpoint_dialog(checkpoint);</span> <span class='diff-add'> })</span> <span class='diff-add'> )</span> <span class='diff-add'> );</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> MenuBar.prototype.update_nbconvert_script = function(langinfo) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set the 'Download as foo' menu option for the relevant language.</span> <span class='diff-add'> */</span> <span class='diff-add'> var el = this.element.find('#download_script');</span> <span class='diff-add'> </span> <span class='diff-add'> // Set menu entry text to e.g. "Python (.py)"</span> <span class='diff-add'> var langname = (langinfo.name || 'Script');</span> <span class='diff-add'> langname = langname.charAt(0).toUpperCase()+langname.substr(1); // Capitalise</span> <span class='diff-add'> el.find('a').text(langname + ' ('+(langinfo.file_extension || 'txt')+')');</span> <span class='diff-add'> };</span> <span class='diff-add'> MenuBar.prototype.add_kernel_help_links = function(help_links) {</span> <span class='diff-add'> /** add links from kernel_info to the help menu */</span> <span class='diff-add'> var divider = $("#kernel-help-links");</span> <span class='diff-add'> if (divider.length === 0) {</span> <span class='diff-add'> // insert kernel help section above about link</span> <span class='diff-add'> var about = $("#notebook_about").parent();</span> <span class='diff-add'> divider = $("<li>")</span> <span class='diff-add'> .attr('id', "kernel-help-links")</span> <span class='diff-add'> .addClass('divider');</span> <span class='diff-add'> about.prev().before(divider);</span> <span class='diff-add'> }</span> <span class='diff-add'> // remove previous entries</span> <span class='diff-add'> while (!divider.next().hasClass('divider')) {</span> <span class='diff-add'> divider.next().remove();</span> <span class='diff-add'> }</span> <span class='diff-add'> if (help_links.length === 0) {</span> <span class='diff-add'> // no help links, remove the divider</span> <span class='diff-add'> divider.remove();</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var cursor = divider;</span> <span class='diff-add'> help_links.map(function (link) {</span> <span class='diff-add'> cursor.after($("<li>")</span> <span class='diff-add'> .append($("<a>")</span> <span class='diff-add'> .attr('target', '_blank')</span> <span class='diff-add'> .attr('title', 'Opens in a new window')</span> <span class='diff-add'> .attr('href', link.url)</span> <span class='diff-add'> .append($("<i>")</span> <span class='diff-add'> .addClass("fa fa-external-link menu-icon pull-right")</span> <span class='diff-add'> )</span> <span class='diff-add'> .append($("<span>")</span> <span class='diff-add'> .text(link.text)</span> <span class='diff-add'> )</span> <span class='diff-add'> )</span> <span class='diff-add'> );</span> <span class='diff-add'> cursor = cursor.next();</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatability.</span> <span class='diff-add'> IPython.MenuBar = MenuBar;</span> <span class='diff-add'> return {'MenuBar': MenuBar};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/meta.js b/ipynb/Array-feature-overlap-05_files/meta.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..fcaed98</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/meta.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span> <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span> <span class='diff-add'>(function(mod) {</span> <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span> <span class='diff-add'> mod(require("../lib/codemirror"));</span> <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span> <span class='diff-add'> define(["../lib/codemirror"], mod);</span> <span class='diff-add'> else // Plain browser env</span> <span class='diff-add'> mod(CodeMirror);</span> <span class='diff-add'>})(function(CodeMirror) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> CodeMirror.modeInfo = [</span> <span class='diff-add'> {name: "APL", mime: "text/apl", mode: "apl", ext: ["dyalog", "apl"]},</span> <span class='diff-add'> {name: "Asterisk", mime: "text/x-asterisk", mode: "asterisk"},</span> <span class='diff-add'> {name: "C", mime: "text/x-csrc", mode: "clike", ext: ["c", "h"]},</span> <span class='diff-add'> {name: "C++", mime: "text/x-c++src", mode: "clike", ext: ["cpp", "c++", "hpp", "h++"], alias: ["cpp"]},</span> <span class='diff-add'> {name: "Cobol", mime: "text/x-cobol", mode: "cobol", ext: ["cob", "cpy"]},</span> <span class='diff-add'> {name: "C#", mime: "text/x-csharp", mode: "clike", ext: ["cs"], alias: ["csharp"]},</span> <span class='diff-add'> {name: "Clojure", mime: "text/x-clojure", mode: "clojure", ext: ["clj"]},</span> <span class='diff-add'> {name: "CoffeeScript", mime: "text/x-coffeescript", mode: "coffeescript", ext: ["coffee"], alias: ["coffee", "coffee-script"]},</span> <span class='diff-add'> {name: "Common Lisp", mime: "text/x-common-lisp", mode: "commonlisp", ext: ["cl", "lisp", "el"], alias: ["lisp"]},</span> <span class='diff-add'> {name: "Cypher", mime: "application/x-cypher-query", mode: "cypher"},</span> <span class='diff-add'> {name: "Cython", mime: "text/x-cython", mode: "python", ext: ["pyx", "pxd", "pxi"]},</span> <span class='diff-add'> {name: "CSS", mime: "text/css", mode: "css", ext: ["css"]},</span> <span class='diff-add'> {name: "CQL", mime: "text/x-cassandra", mode: "sql", ext: ["cql"]},</span> <span class='diff-add'> {name: "D", mime: "text/x-d", mode: "d", ext: ["d"]},</span> <span class='diff-add'> {name: "Dart", mimes: ["application/dart", "text/x-dart"], mode: "dart", ext: ["dart"]},</span> <span class='diff-add'> {name: "diff", mime: "text/x-diff", mode: "diff", ext: ["diff", "patch"]},</span> <span class='diff-add'> {name: "Django", mime: "text/x-django", mode: "django"},</span> <span class='diff-add'> {name: "Dockerfile", mime: "text/x-dockerfile", mode: "dockerfile"},</span> <span class='diff-add'> {name: "DTD", mime: "application/xml-dtd", mode: "dtd", ext: ["dtd"]},</span> <span class='diff-add'> {name: "Dylan", mime: "text/x-dylan", mode: "dylan", ext: ["dylan", "dyl", "intr"]},</span> <span class='diff-add'> {name: "EBNF", mime: "text/x-ebnf", mode: "ebnf"},</span> <span class='diff-add'> {name: "ECL", mime: "text/x-ecl", mode: "ecl", ext: ["ecl"]},</span> <span class='diff-add'> {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]},</span> <span class='diff-add'> {name: "Embedded Javascript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]},</span> <span class='diff-add'> {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]},</span> <span class='diff-add'> {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]},</span> <span class='diff-add'> {name: "Fortran", mime: "text/x-fortran", mode: "fortran", ext: ["f", "for", "f77", "f90"]},</span> <span class='diff-add'> {name: "F#", mime: "text/x-fsharp", mode: "mllike", ext: ["fs"], alias: ["fsharp"]},</span> <span class='diff-add'> {name: "Gas", mime: "text/x-gas", mode: "gas", ext: ["s"]},</span> <span class='diff-add'> {name: "Gherkin", mime: "text/x-feature", mode: "gherkin", ext: ["feature"]},</span> <span class='diff-add'> {name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm"},</span> <span class='diff-add'> {name: "Go", mime: "text/x-go", mode: "go", ext: ["go"]},</span> <span class='diff-add'> {name: "Groovy", mime: "text/x-groovy", mode: "groovy", ext: ["groovy"]},</span> <span class='diff-add'> {name: "HAML", mime: "text/x-haml", mode: "haml", ext: ["haml"]},</span> <span class='diff-add'> {name: "Haskell", mime: "text/x-haskell", mode: "haskell", ext: ["hs"]},</span> <span class='diff-add'> {name: "Haxe", mime: "text/x-haxe", mode: "haxe", ext: ["hx"]},</span> <span class='diff-add'> {name: "HXML", mime: "text/x-hxml", mode: "haxe", ext: ["hxml"]},</span> <span class='diff-add'> {name: "ASP.NET", mime: "application/x-aspx", mode: "htmlembedded", ext: ["aspx"], alias: ["asp", "aspx"]},</span> <span class='diff-add'> {name: "HTML", mime: "text/html", mode: "htmlmixed", ext: ["html", "htm"], alias: ["xhtml"]},</span> <span class='diff-add'> {name: "HTTP", mime: "message/http", mode: "http"},</span> <span class='diff-add'> {name: "IDL", mime: "text/x-idl", mode: "idl", ext: ["pro"]},</span> <span class='diff-add'> {name: "Jade", mime: "text/x-jade", mode: "jade", ext: ["jade"]},</span> <span class='diff-add'> {name: "Java", mime: "text/x-java", mode: "clike", ext: ["java"]},</span> <span class='diff-add'> {name: "Java Server Pages", mime: "application/x-jsp", mode: "htmlembedded", ext: ["jsp"], alias: ["jsp"]},</span> <span class='diff-add'> {name: "JavaScript", mimes: ["text/javascript", "text/ecmascript", "application/javascript", "application/x-javascript", "application/ecmascript"],</span> <span class='diff-add'> mode: "javascript", ext: ["js"], alias: ["ecmascript", "js", "node"]},</span> <span class='diff-add'> {name: "JSON", mimes: ["application/json", "application/x-json"], mode: "javascript", ext: ["json", "map"], alias: ["json5"]},</span> <span class='diff-add'> {name: "JSON-LD", mime: "application/ld+json", mode: "javascript", alias: ["jsonld"]},</span> <span class='diff-add'> {name: "Jinja2", mime: "null", mode: "jinja2"},</span> <span class='diff-add'> {name: "Julia", mime: "text/x-julia", mode: "julia", ext: ["jl"]},</span> <span class='diff-add'> {name: "Kotlin", mime: "text/x-kotlin", mode: "kotlin", ext: ["kt"]},</span> <span class='diff-add'> {name: "LESS", mime: "text/x-less", mode: "css", ext: ["less"]},</span> <span class='diff-add'> {name: "LiveScript", mime: "text/x-livescript", mode: "livescript", ext: ["ls"], alias: ["ls"]},</span> <span class='diff-add'> {name: "Lua", mime: "text/x-lua", mode: "lua", ext: ["lua"]},</span> <span class='diff-add'> {name: "Markdown", mime: "text/x-markdown", mode: "markdown", ext: ["markdown", "md", "mkd"]},</span> <span class='diff-add'> {name: "mIRC", mime: "text/mirc", mode: "mirc"},</span> <span class='diff-add'> {name: "MariaDB SQL", mime: "text/x-mariadb", mode: "sql"},</span> <span class='diff-add'> {name: "Modelica", mime: "text/x-modelica", mode: "modelica", ext: ["mo"]},</span> <span class='diff-add'> {name: "MS SQL", mime: "text/x-mssql", mode: "sql"},</span> <span class='diff-add'> {name: "MySQL", mime: "text/x-mysql", mode: "sql"},</span> <span class='diff-add'> {name: "Nginx", mime: "text/x-nginx-conf", mode: "nginx"},</span> <span class='diff-add'> {name: "NTriples", mime: "text/n-triples", mode: "ntriples", ext: ["nt"]},</span> <span class='diff-add'> {name: "Objective C", mime: "text/x-objectivec", mode: "clike", ext: ["m", "mm"]},</span> <span class='diff-add'> {name: "OCaml", mime: "text/x-ocaml", mode: "mllike", ext: ["ml", "mli", "mll", "mly"]},</span> <span class='diff-add'> {name: "Octave", mime: "text/x-octave", mode: "octave", ext: ["m"]},</span> <span class='diff-add'> {name: "Pascal", mime: "text/x-pascal", mode: "pascal", ext: ["p", "pas"]},</span> <span class='diff-add'> {name: "PEG.js", mime: "null", mode: "pegjs"},</span> <span class='diff-add'> {name: "Perl", mime: "text/x-perl", mode: "perl", ext: ["pl", "pm"]},</span> <span class='diff-add'> {name: "PHP", mime: "application/x-httpd-php", mode: "php", ext: ["php", "php3", "php4", "php5", "phtml"]},</span> <span class='diff-add'> {name: "Pig", mime: "text/x-pig", mode: "pig"},</span> <span class='diff-add'> {name: "Plain Text", mime: "text/plain", mode: "null", ext: ["txt", "text", "conf", "def", "list", "log"]},</span> <span class='diff-add'> {name: "PLSQL", mime: "text/x-plsql", mode: "sql"},</span> <span class='diff-add'> {name: "Properties files", mime: "text/x-properties", mode: "properties", ext: ["properties", "ini", "in"], alias: ["ini", "properties"]},</span> <span class='diff-add'> {name: "Python", mime: "text/x-python", mode: "python", ext: ["py", "pyw"]},</span> <span class='diff-add'> {name: "Puppet", mime: "text/x-puppet", mode: "puppet", ext: ["pp"]},</span> <span class='diff-add'> {name: "Q", mime: "text/x-q", mode: "q", ext: ["q"]},</span> <span class='diff-add'> {name: "R", mime: "text/x-rsrc", mode: "r", ext: ["r"], alias: ["rscript"]},</span> <span class='diff-add'> {name: "reStructuredText", mime: "text/x-rst", mode: "rst", ext: ["rst"], alias: ["rst"]},</span> <span class='diff-add'> {name: "RPM Changes", mime: "text/x-rpm-changes", mode: "rpm"},</span> <span class='diff-add'> {name: "RPM Spec", mime: "text/x-rpm-spec", mode: "rpm", ext: ["spec"]},</span> <span class='diff-add'> {name: "Ruby", mime: "text/x-ruby", mode: "ruby", ext: ["rb"], alias: ["jruby", "macruby", "rake", "rb", "rbx"]},</span> <span class='diff-add'> {name: "Rust", mime: "text/x-rustsrc", mode: "rust", ext: ["rs"]},</span> <span class='diff-add'> {name: "Sass", mime: "text/x-sass", mode: "sass", ext: ["sass"]},</span> <span class='diff-add'> {name: "Scala", mime: "text/x-scala", mode: "clike", ext: ["scala"]},</span> <span class='diff-add'> {name: "Scheme", mime: "text/x-scheme", mode: "scheme", ext: ["scm", "ss"]},</span> <span class='diff-add'> {name: "SCSS", mime: "text/x-scss", mode: "css", ext: ["scss"]},</span> <span class='diff-add'> {name: "Shell", mime: "text/x-sh", mode: "shell", ext: ["sh", "ksh", "bash"], alias: ["bash", "sh", "zsh"]},</span> <span class='diff-add'> {name: "Sieve", mime: "application/sieve", mode: "sieve"},</span> <span class='diff-add'> {name: "Slim", mimes: ["text/x-slim", "application/x-slim"], mode: "slim"},</span> <span class='diff-add'> {name: "Smalltalk", mime: "text/x-stsrc", mode: "smalltalk", ext: ["st"]},</span> <span class='diff-add'> {name: "Smarty", mime: "text/x-smarty", mode: "smarty", ext: ["tpl"]},</span> <span class='diff-add'> {name: "SmartyMixed", mime: "text/x-smarty", mode: "smartymixed"},</span> <span class='diff-add'> {name: "Solr", mime: "text/x-solr", mode: "solr"},</span> <span class='diff-add'> {name: "Soy", mime: "text/x-soy", mode: "soy", ext: ["soy"], alias: ["closure template"]},</span> <span class='diff-add'> {name: "SPARQL", mime: "application/sparql-query", mode: "sparql", ext: ["rq", "sparql"], alias: ["sparul"]},</span> <span class='diff-add'> {name: "Spreadsheet", mime: "text/x-spreadsheet", mode: "spreadsheet", alias: ["excel", "formula"]},</span> <span class='diff-add'> {name: "SQL", mime: "text/x-sql", mode: "sql", ext: ["sql"]},</span> <span class='diff-add'> {name: "MariaDB", mime: "text/x-mariadb", mode: "sql"},</span> <span class='diff-add'> {name: "sTeX", mime: "text/x-stex", mode: "stex"},</span> <span class='diff-add'> {name: "LaTeX", mime: "text/x-latex", mode: "stex", ext: ["text", "ltx"], alias: ["tex"]},</span> <span class='diff-add'> {name: "SystemVerilog", mime: "text/x-systemverilog", mode: "verilog", ext: ["v"]},</span> <span class='diff-add'> {name: "Tcl", mime: "text/x-tcl", mode: "tcl", ext: ["tcl"]},</span> <span class='diff-add'> {name: "Textile", mime: "text/x-textile", mode: "textile"},</span> <span class='diff-add'> {name: "TiddlyWiki ", mime: "text/x-tiddlywiki", mode: "tiddlywiki"},</span> <span class='diff-add'> {name: "Tiki wiki", mime: "text/tiki", mode: "tiki"},</span> <span class='diff-add'> {name: "TOML", mime: "text/x-toml", mode: "toml"},</span> <span class='diff-add'> {name: "Tornado", mime: "text/x-tornado", mode: "tornado"},</span> <span class='diff-add'> {name: "Turtle", mime: "text/turtle", mode: "turtle", ext: ["ttl"]},</span> <span class='diff-add'> {name: "TypeScript", mime: "application/typescript", mode: "javascript", ext: ["ts"], alias: ["ts"]},</span> <span class='diff-add'> {name: "VB.NET", mime: "text/x-vb", mode: "vb", ext: ["vb"]},</span> <span class='diff-add'> {name: "VBScript", mime: "text/vbscript", mode: "vbscript"},</span> <span class='diff-add'> {name: "Velocity", mime: "text/velocity", mode: "velocity", ext: ["vtl"]},</span> <span class='diff-add'> {name: "Verilog", mime: "text/x-verilog", mode: "verilog", ext: ["v"]},</span> <span class='diff-add'> {name: "XML", mimes: ["application/xml", "text/xml"], mode: "xml", ext: ["xml", "xsl", "xsd"], alias: ["rss", "wsdl", "xsd"]},</span> <span class='diff-add'> {name: "XQuery", mime: "application/xquery", mode: "xquery", ext: ["xy", "xquery"]},</span> <span class='diff-add'> {name: "YAML", mime: "text/x-yaml", mode: "yaml", ext: ["yaml"], alias: ["yml"]},</span> <span class='diff-add'> {name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]}</span> <span class='diff-add'> ];</span> <span class='diff-add'> // Ensure all modes have a mime property for backwards compatibility</span> <span class='diff-add'> for (var i = 0; i < CodeMirror.modeInfo.length; i++) {</span> <span class='diff-add'> var info = CodeMirror.modeInfo[i];</span> <span class='diff-add'> if (info.mimes) info.mime = info.mimes[0];</span> <span class='diff-add'> }</span> <span class='diff-add'> CodeMirror.findModeByMIME = function(mime) {</span> <span class='diff-add'> for (var i = 0; i < CodeMirror.modeInfo.length; i++) {</span> <span class='diff-add'> var info = CodeMirror.modeInfo[i];</span> <span class='diff-add'> if (info.mime == mime) return info;</span> <span class='diff-add'> if (info.mimes) for (var j = 0; j < info.mimes.length; j++)</span> <span class='diff-add'> if (info.mimes[j] == mime) return info;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeMirror.findModeByExtension = function(ext) {</span> <span class='diff-add'> for (var i = 0; i < CodeMirror.modeInfo.length; i++) {</span> <span class='diff-add'> var info = CodeMirror.modeInfo[i];</span> <span class='diff-add'> if (info.ext) for (var j = 0; j < info.ext.length; j++)</span> <span class='diff-add'> if (info.ext[j] == ext) return info;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> CodeMirror.findModeByName = function(name) {</span> <span class='diff-add'> name = name.toLowerCase();</span> <span class='diff-add'> for (var i = 0; i < CodeMirror.modeInfo.length; i++) {</span> <span class='diff-add'> var info = CodeMirror.modeInfo[i];</span> <span class='diff-add'> if (info.name.toLowerCase() == name) return info;</span> <span class='diff-add'> if (info.alias) for (var j = 0; j < info.alias.length; j++)</span> <span class='diff-add'> if (info.alias[j].toLowerCase() == name) return info;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/moment.js b/ipynb/Array-feature-overlap-05_files/moment.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..85e190d</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/moment.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>//! moment.js</span> <span class='diff-add'>//! version : 2.8.4</span> <span class='diff-add'>//! authors : Tim Wood, Iskren Chernev, Moment.js contributors</span> <span class='diff-add'>//! license : MIT</span> <span class='diff-add'>//! momentjs.com</span> <span class='diff-add'>(function (undefined) {</span> <span class='diff-add'> /************************************</span> <span class='diff-add'> Constants</span> <span class='diff-add'> ************************************/</span> <span class='diff-add'> var moment,</span> <span class='diff-add'> VERSION = '2.8.4',</span> <span class='diff-add'> // the global-scope this is NOT the global object in Node.js</span> <span class='diff-add'> globalScope = typeof global !== 'undefined' ? global : this,</span> <span class='diff-add'> oldGlobalMoment,</span> <span class='diff-add'> round = Math.round,</span> <span class='diff-add'> hasOwnProperty = Object.prototype.hasOwnProperty,</span> <span class='diff-add'> i,</span> <span class='diff-add'> YEAR = 0,</span> <span class='diff-add'> MONTH = 1,</span> <span class='diff-add'> DATE = 2,</span> <span class='diff-add'> HOUR = 3,</span> <span class='diff-add'> MINUTE = 4,</span> <span class='diff-add'> SECOND = 5,</span> <span class='diff-add'> MILLISECOND = 6,</span> <span class='diff-add'> // internal storage for locale config files</span> <span class='diff-add'> locales = {},</span> <span class='diff-add'> // extra moment internal properties (plugins register props here)</span> <span class='diff-add'> momentProperties = [],</span> <span class='diff-add'> // check for nodeJS</span> <span class='diff-add'> hasModule = (typeof module !== 'undefined' && module && module.exports),</span> <span class='diff-add'> // ASP.NET json date format regex</span> <span class='diff-add'> aspNetJsonRegex = /^\/?Date\((\-?\d+)/i,</span> <span class='diff-add'> aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,</span> <span class='diff-add'> // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html</span> <span class='diff-add'> // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere</span> <span class='diff-add'> isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,</span> <span class='diff-add'> // format tokens</span> <span class='diff-add'> formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g,</span> <span class='diff-add'> localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,</span> <span class='diff-add'> // parsing token regexes</span> <span class='diff-add'> parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99</span> <span class='diff-add'> parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999</span> <span class='diff-add'> parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999</span> <span class='diff-add'> parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999</span> <span class='diff-add'> parseTokenDigits = /\d+/, // nonzero number of digits</span> <span class='diff-add'> parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic.</span> <span class='diff-add'> parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z</span> <span class='diff-add'> parseTokenT = /T/i, // T (ISO separator)</span> <span class='diff-add'> parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123</span> <span class='diff-add'> parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123</span> <span class='diff-add'> //strict parsing regexes</span> <span class='diff-add'> parseTokenOneDigit = /\d/, // 0 - 9</span> <span class='diff-add'> parseTokenTwoDigits = /\d\d/, // 00 - 99</span> <span class='diff-add'> parseTokenThreeDigits = /\d{3}/, // 000 - 999</span> <span class='diff-add'> parseTokenFourDigits = /\d{4}/, // 0000 - 9999</span> <span class='diff-add'> parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999</span> <span class='diff-add'> parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf</span> <span class='diff-add'> // iso 8601 regex</span> <span class='diff-add'> // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)</span> <span class='diff-add'> isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,</span> <span class='diff-add'> isoFormat = 'YYYY-MM-DDTHH:mm:ssZ',</span> <span class='diff-add'> isoDates = [</span> <span class='diff-add'> ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/],</span> <span class='diff-add'> ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/],</span> <span class='diff-add'> ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/],</span> <span class='diff-add'> ['GGGG-[W]WW', /\d{4}-W\d{2}/],</span> <span class='diff-add'> ['YYYY-DDD', /\d{4}-\d{3}/]</span> <span class='diff-add'> ],</span> <span class='diff-add'> // iso time formats and regexes</span> <span class='diff-add'> isoTimes = [</span> <span class='diff-add'> ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/],</span> <span class='diff-add'> ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/],</span> <span class='diff-add'> ['HH:mm', /(T| )\d\d:\d\d/],</span> <span class='diff-add'> ['HH', /(T| )\d\d/]</span> <span class='diff-add'> ],</span> <span class='diff-add'> // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-15', '30']</span> <span class='diff-add'> parseTimezoneChunker = /([\+\-]|\d\d)/gi,</span> <span class='diff-add'> // getter and setter names</span> <span class='diff-add'> proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'),</span> <span class='diff-add'> unitMillisecondFactors = {</span> <span class='diff-add'> 'Milliseconds' : 1,</span> <span class='diff-add'> 'Seconds' : 1e3,</span> <span class='diff-add'> 'Minutes' : 6e4,</span> <span class='diff-add'> 'Hours' : 36e5,</span> <span class='diff-add'> 'Days' : 864e5,</span> <span class='diff-add'> 'Months' : 2592e6,</span> <span class='diff-add'> 'Years' : 31536e6</span> <span class='diff-add'> },</span> <span class='diff-add'> unitAliases = {</span> <span class='diff-add'> ms : 'millisecond',</span> <span class='diff-add'> s : 'second',</span> <span class='diff-add'> m : 'minute',</span> <span class='diff-add'> h : 'hour',</span> <span class='diff-add'> d : 'day',</span> <span class='diff-add'> D : 'date',</span> <span class='diff-add'> w : 'week',</span> <span class='diff-add'> W : 'isoWeek',</span> <span class='diff-add'> M : 'month',</span> <span class='diff-add'> Q : 'quarter',</span> <span class='diff-add'> y : 'year',</span> <span class='diff-add'> DDD : 'dayOfYear',</span> <span class='diff-add'> e : 'weekday',</span> <span class='diff-add'> E : 'isoWeekday',</span> <span class='diff-add'> gg: 'weekYear',</span> <span class='diff-add'> GG: 'isoWeekYear'</span> <span class='diff-add'> },</span> <span class='diff-add'> camelFunctions = {</span> <span class='diff-add'> dayofyear : 'dayOfYear',</span> <span class='diff-add'> isoweekday : 'isoWeekday',</span> <span class='diff-add'> isoweek : 'isoWeek',</span> <span class='diff-add'> weekyear : 'weekYear',</span> <span class='diff-add'> isoweekyear : 'isoWeekYear'</span> <span class='diff-add'> },</span> <span class='diff-add'> // format function strings</span> <span class='diff-add'> formatFunctions = {},</span> <span class='diff-add'> // default relative time thresholds</span> <span class='diff-add'> relativeTimeThresholds = {</span> <span class='diff-add'> s: 45, // seconds to minute</span> <span class='diff-add'> m: 45, // minutes to hour</span> <span class='diff-add'> h: 22, // hours to day</span> <span class='diff-add'> d: 26, // days to month</span> <span class='diff-add'> M: 11 // months to year</span> <span class='diff-add'> },</span> <span class='diff-add'> // tokens to ordinalize and pad</span> <span class='diff-add'> ordinalizeTokens = 'DDD w W M D d'.split(' '),</span> <span class='diff-add'> paddedTokens = 'M D H h m s w W'.split(' '),</span> <span class='diff-add'> formatTokenFunctions = {</span> <span class='diff-add'> M : function () {</span> <span class='diff-add'> return this.month() + 1;</span> <span class='diff-add'> },</span> <span class='diff-add'> MMM : function (format) {</span> <span class='diff-add'> return this.localeData().monthsShort(this, format);</span> <span class='diff-add'> },</span> <span class='diff-add'> MMMM : function (format) {</span> <span class='diff-add'> return this.localeData().months(this, format);</span> <span class='diff-add'> },</span> <span class='diff-add'> D : function () {</span> <span class='diff-add'> return this.date();</span> <span class='diff-add'> },</span> <span class='diff-add'> DDD : function () {</span> <span class='diff-add'> return this.dayOfYear();</span> <span class='diff-add'> },</span> <span class='diff-add'> d : function () {</span> <span class='diff-add'> return this.day();</span> <span class='diff-add'> },</span> <span class='diff-add'> dd : function (format) {</span> <span class='diff-add'> return this.localeData().weekdaysMin(this, format);</span> <span class='diff-add'> },</span> <span class='diff-add'> ddd : function (format) {</span> <span class='diff-add'> return this.localeData().weekdaysShort(this, format);</span> <span class='diff-add'> },</span> <span class='diff-add'> dddd : function (format) {</span> <span class='diff-add'> return this.localeData().weekdays(this, format);</span> <span class='diff-add'> },</span> <span class='diff-add'> w : function () {</span> <span class='diff-add'> return this.week();</span> <span class='diff-add'> },</span> <span class='diff-add'> W : function () {</span> <span class='diff-add'> return this.isoWeek();</span> <span class='diff-add'> },</span> <span class='diff-add'> YY : function () {</span> <span class='diff-add'> return leftZeroFill(this.year() % 100, 2);</span> <span class='diff-add'> },</span> <span class='diff-add'> YYYY : function () {</span> <span class='diff-add'> return leftZeroFill(this.year(), 4);</span> <span class='diff-add'> },</span> <span class='diff-add'> YYYYY : function () {</span> <span class='diff-add'> return leftZeroFill(this.year(), 5);</span> <span class='diff-add'> },</span> <span class='diff-add'> YYYYYY : function () {</span> <span class='diff-add'> var y = this.year(), sign = y >= 0 ? '+' : '-';</span> <span class='diff-add'> return sign + leftZeroFill(Math.abs(y), 6);</span> <span class='diff-add'> },</span> <span class='diff-add'> gg : function () {</span> <span class='diff-add'> return leftZeroFill(this.weekYear() % 100, 2);</span> <span class='diff-add'> },</span> <span class='diff-add'> gggg : function () {</span> <span class='diff-add'> return leftZeroFill(this.weekYear(), 4);</span> <span class='diff-add'> },</span> <span class='diff-add'> ggggg : function () {</span> <span class='diff-add'> return leftZeroFill(this.weekYear(), 5);</span> <span class='diff-add'> },</span> <span class='diff-add'> GG : function () {</span> <span class='diff-add'> return leftZeroFill(this.isoWeekYear() % 100, 2);</span> <span class='diff-add'> },</span> <span class='diff-add'> GGGG : function () {</span> <span class='diff-add'> return leftZeroFill(this.isoWeekYear(), 4);</span> <span class='diff-add'> },</span> <span class='diff-add'> GGGGG : function () {</span> <span class='diff-add'> return leftZeroFill(this.isoWeekYear(), 5);</span> <span class='diff-add'> },</span> <span class='diff-add'> e : function () {</span> <span class='diff-add'> return this.weekday();</span> <span class='diff-add'> },</span> <span class='diff-add'> E : function () {</span> <span class='diff-add'> return this.isoWeekday();</span> <span class='diff-add'> },</span> <span class='diff-add'> a : function () {</span> <span class='diff-add'> return this.localeData().meridiem(this.hours(), this.minutes(), true);</span> <span class='diff-add'> },</span> <span class='diff-add'> A : function () {</span> <span class='diff-add'> return this.localeData().meridiem(this.hours(), this.minutes(), false);</span> <span class='diff-add'> },</span> <span class='diff-add'> H : function () {</span> <span class='diff-add'> return this.hours();</span> <span class='diff-add'> },</span> <span class='diff-add'> h : function () {</span> <span class='diff-add'> return this.hours() % 12 || 12;</span> <span class='diff-add'> },</span> <span class='diff-add'> m : function () {</span> <span class='diff-add'> return this.minutes();</span> <span class='diff-add'> },</span> <span class='diff-add'> s : function () {</span> <span class='diff-add'> return this.seconds();</span> <span class='diff-add'> },</span> <span class='diff-add'> S : function () {</span> <span class='diff-add'> return toInt(this.milliseconds() / 100);</span> <span class='diff-add'> },</span> <span class='diff-add'> SS : function () {</span> <span class='diff-add'> return leftZeroFill(toInt(this.milliseconds() / 10), 2);</span> <span class='diff-add'> },</span> <span class='diff-add'> SSS : function () {</span> <span class='diff-add'> return leftZeroFill(this.milliseconds(), 3);</span> <span class='diff-add'> },</span> <span class='diff-add'> SSSS : function () {</span> <span class='diff-add'> return leftZeroFill(this.milliseconds(), 3);</span> <span class='diff-add'> },</span> <span class='diff-add'> Z : function () {</span> <span class='diff-add'> var a = -this.zone(),</span> <span class='diff-add'> b = '+';</span> <span class='diff-add'> if (a < 0) {</span> <span class='diff-add'> a = -a;</span> <span class='diff-add'> b = '-';</span> <span class='diff-add'> }</span> <span class='diff-add'> return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2);</span> <span class='diff-add'> },</span> <span class='diff-add'> ZZ : function () {</span> <span class='diff-add'> var a = -this.zone(),</span> <span class='diff-add'> b = '+';</span> <span class='diff-add'> if (a < 0) {</span> <span class='diff-add'> a = -a;</span> <span class='diff-add'> b = '-';</span> <span class='diff-add'> }</span> <span class='diff-add'> return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2);</span> <span class='diff-add'> },</span> <span class='diff-add'> z : function () {</span> <span class='diff-add'> return this.zoneAbbr();</span> <span class='diff-add'> },</span> <span class='diff-add'> zz : function () {</span> <span class='diff-add'> return this.zoneName();</span> <span class='diff-add'> },</span> <span class='diff-add'> x : function () {</span> <span class='diff-add'> return this.valueOf();</span> <span class='diff-add'> },</span> <span class='diff-add'> X : function () {</span> <span class='diff-add'> return this.unix();</span> <span class='diff-add'> },</span> <span class='diff-add'> Q : function () {</span> <span class='diff-add'> return this.quarter();</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> deprecations = {},</span> <span class='diff-add'> lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'];</span> <span class='diff-add'> // Pick the first defined of two or three arguments. dfl comes from</span> <span class='diff-add'> // default.</span> <span class='diff-add'> function dfl(a, b, c) {</span> <span class='diff-add'> switch (arguments.length) {</span> <span class='diff-add'> case 2: return a != null ? a : b;</span> <span class='diff-add'> case 3: return a != null ? a : b != null ? b : c;</span> <span class='diff-add'> default: throw new Error('Implement me');</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function hasOwnProp(a, b) {</span> <span class='diff-add'> return hasOwnProperty.call(a, b);</span> <span class='diff-add'> }</span> <span class='diff-add'> function defaultParsingFlags() {</span> <span class='diff-add'> // We need to deep clone this object, and es5 standard is not very</span> <span class='diff-add'> // helpful.</span> <span class='diff-add'> return {</span> <span class='diff-add'> empty : false,</span> <span class='diff-add'> unusedTokens : [],</span> <span class='diff-add'> unusedInput : [],</span> <span class='diff-add'> overflow : -2,</span> <span class='diff-add'> charsLeftOver : 0,</span> <span class='diff-add'> nullInput : false,</span> <span class='diff-add'> invalidMonth : null,</span> <span class='diff-add'> invalidFormat : false,</span> <span class='diff-add'> userInvalidated : false,</span> <span class='diff-add'> iso: false</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> function printMsg(msg) {</span> <span class='diff-add'> if (moment.suppressDeprecationWarnings === false &&</span> <span class='diff-add'> typeof console !== 'undefined' && console.warn) {</span> <span class='diff-add'> console.warn('Deprecation warning: ' + msg);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function deprecate(msg, fn) {</span> <span class='diff-add'> var firstTime = true;</span> <span class='diff-add'> return extend(function () {</span> <span class='diff-add'> if (firstTime) {</span> <span class='diff-add'> printMsg(msg);</span> <span class='diff-add'> firstTime = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> return fn.apply(this, arguments);</span> <span class='diff-add'> }, fn);</span> <span class='diff-add'> }</span> <span class='diff-add'> function deprecateSimple(name, msg) {</span> <span class='diff-add'> if (!deprecations[name]) {</span> <span class='diff-add'> printMsg(msg);</span> <span class='diff-add'> deprecations[name] = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function padToken(func, count) {</span> <span class='diff-add'> return function (a) {</span> <span class='diff-add'> return leftZeroFill(func.call(this, a), count);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> function ordinalizeToken(func, period) {</span> <span class='diff-add'> return function (a) {</span> <span class='diff-add'> return this.localeData().ordinal(func.call(this, a), period);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> while (ordinalizeTokens.length) {</span> <span class='diff-add'> i = ordinalizeTokens.pop();</span> <span class='diff-add'> formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i);</span> <span class='diff-add'> }</span> <span class='diff-add'> while (paddedTokens.length) {</span> <span class='diff-add'> i = paddedTokens.pop();</span> <span class='diff-add'> formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2);</span> <span class='diff-add'> }</span> <span class='diff-add'> formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3);</span> <span class='diff-add'> /************************************</span> <span class='diff-add'> Constructors</span> <span class='diff-add'> ************************************/</span> <span class='diff-add'> function Locale() {</span> <span class='diff-add'> }</span> <span class='diff-add'> // Moment prototype object</span> <span class='diff-add'> function Moment(config, skipOverflow) {</span> <span class='diff-add'> if (skipOverflow !== false) {</span> <span class='diff-add'> checkOverflow(config);</span> <span class='diff-add'> }</span> <span class='diff-add'> copyConfig(this, config);</span> <span class='diff-add'> this._d = new Date(+config._d);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Duration Constructor</span> <span class='diff-add'> function Duration(duration) {</span> <span class='diff-add'> var normalizedInput = normalizeObjectUnits(duration),</span> <span class='diff-add'> years = normalizedInput.year || 0,</span> <span class='diff-add'> quarters = normalizedInput.quarter || 0,</span> <span class='diff-add'> months = normalizedInput.month || 0,</span> <span class='diff-add'> weeks = normalizedInput.week || 0,</span> <span class='diff-add'> days = normalizedInput.day || 0,</span> <span class='diff-add'> hours = normalizedInput.hour || 0,</span> <span class='diff-add'> minutes = normalizedInput.minute || 0,</span> <span class='diff-add'> seconds = normalizedInput.second || 0,</span> <span class='diff-add'> milliseconds = normalizedInput.millisecond || 0;</span> <span class='diff-add'> // representation for dateAddRemove</span> <span class='diff-add'> this._milliseconds = +milliseconds +</span> <span class='diff-add'> seconds * 1e3 + // 1000</span> <span class='diff-add'> minutes * 6e4 + // 1000 * 60</span> <span class='diff-add'> hours * 36e5; // 1000 * 60 * 60</span> <span class='diff-add'> // Because of dateAddRemove treats 24 hours as different from a</span> <span class='diff-add'> // day when working around DST, we need to store them separately</span> <span class='diff-add'> this._days = +days +</span> <span class='diff-add'> weeks * 7;</span> <span class='diff-add'> // It is impossible translate months into days without knowing</span> <span class='diff-add'> // which months you are are talking about, so we have to store</span> <span class='diff-add'> // it separately.</span> <span class='diff-add'> this._months = +months +</span> <span class='diff-add'> quarters * 3 +</span> <span class='diff-add'> years * 12;</span> <span class='diff-add'> this._data = {};</span> <span class='diff-add'> this._locale = moment.localeData();</span> <span class='diff-add'> this._bubble();</span> <span class='diff-add'> }</span> <span class='diff-add'> /************************************</span> <span class='diff-add'> Helpers</span> <span class='diff-add'> ************************************/</span> <span class='diff-add'> function extend(a, b) {</span> <span class='diff-add'> for (var i in b) {</span> <span class='diff-add'> if (hasOwnProp(b, i)) {</span> <span class='diff-add'> a[i] = b[i];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (hasOwnProp(b, 'toString')) {</span> <span class='diff-add'> a.toString = b.toString;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (hasOwnProp(b, 'valueOf')) {</span> <span class='diff-add'> a.valueOf = b.valueOf;</span> <span class='diff-add'> }</span> <span class='diff-add'> return a;</span> <span class='diff-add'> }</span> <span class='diff-add'> function copyConfig(to, from) {</span> <span class='diff-add'> var i, prop, val;</span> <span class='diff-add'> if (typeof from._isAMomentObject !== 'undefined') {</span> <span class='diff-add'> to._isAMomentObject = from._isAMomentObject;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (typeof from._i !== 'undefined') {</span> <span class='diff-add'> to._i = from._i;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (typeof from._f !== 'undefined') {</span> <span class='diff-add'> to._f = from._f;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (typeof from._l !== 'undefined') {</span> <span class='diff-add'> to._l = from._l;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (typeof from._strict !== 'undefined') {</span> <span class='diff-add'> to._strict = from._strict;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (typeof from._tzm !== 'undefined') {</span> <span class='diff-add'> to._tzm = from._tzm;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (typeof from._isUTC !== 'undefined') {</span> <span class='diff-add'> to._isUTC = from._isUTC;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (typeof from._offset !== 'undefined') {</span> <span class='diff-add'> to._offset = from._offset;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (typeof from._pf !== 'undefined') {</span> <span class='diff-add'> to._pf = from._pf;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (typeof from._locale !== 'undefined') {</span> <span class='diff-add'> to._locale = from._locale;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (momentProperties.length > 0) {</span> <span class='diff-add'> for (i in momentProperties) {</span> <span class='diff-add'> prop = momentProperties[i];</span> <span class='diff-add'> val = from[prop];</span> <span class='diff-add'> if (typeof val !== 'undefined') {</span> <span class='diff-add'> to[prop] = val;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return to;</span> <span class='diff-add'> }</span> <span class='diff-add'> function absRound(number) {</span> <span class='diff-add'> if (number < 0) {</span> <span class='diff-add'> return Math.ceil(number);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return Math.floor(number);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // left zero fill a number</span> <span class='diff-add'> // see http://jsperf.com/left-zero-filling for performance comparison</span> <span class='diff-add'> function leftZeroFill(number, targetLength, forceSign) {</span> <span class='diff-add'> var output = '' + Math.abs(number),</span> <span class='diff-add'> sign = number >= 0;</span> <span class='diff-add'> while (output.length < targetLength) {</span> <span class='diff-add'> output = '0' + output;</span> <span class='diff-add'> }</span> <span class='diff-add'> return (sign ? (forceSign ? '+' : '') : '-') + output;</span> <span class='diff-add'> }</span> <span class='diff-add'> function positiveMomentsDifference(base, other) {</span> <span class='diff-add'> var res = {milliseconds: 0, months: 0};</span> <span class='diff-add'> res.months = other.month() - base.month() +</span> <span class='diff-add'> (other.year() - base.year()) * 12;</span> <span class='diff-add'> if (base.clone().add(res.months, 'M').isAfter(other)) {</span> <span class='diff-add'> --res.months;</span> <span class='diff-add'> }</span> <span class='diff-add'> res.milliseconds = +other - +(base.clone().add(res.months, 'M'));</span> <span class='diff-add'> return res;</span> <span class='diff-add'> }</span> <span class='diff-add'> function momentsDifference(base, other) {</span> <span class='diff-add'> var res;</span> <span class='diff-add'> other = makeAs(other, base);</span> <span class='diff-add'> if (base.isBefore(other)) {</span> <span class='diff-add'> res = positiveMomentsDifference(base, other);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> res = positiveMomentsDifference(other, base);</span> <span class='diff-add'> res.milliseconds = -res.milliseconds;</span> <span class='diff-add'> res.months = -res.months;</span> <span class='diff-add'> }</span> <span class='diff-add'> return res;</span> <span class='diff-add'> }</span> <span class='diff-add'> // TODO: remove 'name' arg after deprecation is removed</span> <span class='diff-add'> function createAdder(direction, name) {</span> <span class='diff-add'> return function (val, period) {</span> <span class='diff-add'> var dur, tmp;</span> <span class='diff-add'> //invert the arguments, but complain about it</span> <span class='diff-add'> if (period !== null && !isNaN(+period)) {</span> <span class='diff-add'> deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).');</span> <span class='diff-add'> tmp = val; val = period; period = tmp;</span> <span class='diff-add'> }</span> <span class='diff-add'> val = typeof val === 'string' ? +val : val;</span> <span class='diff-add'> dur = moment.duration(val, period);</span> <span class='diff-add'> addOrSubtractDurationFromMoment(this, dur, direction);</span> <span class='diff-add'> return this;</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) {</span> <span class='diff-add'> var milliseconds = duration._milliseconds,</span> <span class='diff-add'> days = duration._days,</span> <span class='diff-add'> months = duration._months;</span> <span class='diff-add'> updateOffset = updateOffset == null ? true : updateOffset;</span> <span class='diff-add'> if (milliseconds) {</span> <span class='diff-add'> mom._d.setTime(+mom._d + milliseconds * isAdding);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (days) {</span> <span class='diff-add'> rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (months) {</span> <span class='diff-add'> rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (updateOffset) {</span> <span class='diff-add'> moment.updateOffset(mom, days || months);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // check if is an array</span> <span class='diff-add'> function isArray(input) {</span> <span class='diff-add'> return Object.prototype.toString.call(input) === '[object Array]';</span> <span class='diff-add'> }</span> <span class='diff-add'> function isDate(input) {</span> <span class='diff-add'> return Object.prototype.toString.call(input) === '[object Date]' ||</span> <span class='diff-add'> input instanceof Date;</span> <span class='diff-add'> }</span> <span class='diff-add'> // compare two arrays, return the number of differences</span> <span class='diff-add'> function compareArrays(array1, array2, dontConvert) {</span> <span class='diff-add'> var len = Math.min(array1.length, array2.length),</span> <span class='diff-add'> lengthDiff = Math.abs(array1.length - array2.length),</span> <span class='diff-add'> diffs = 0,</span> <span class='diff-add'> i;</span> <span class='diff-add'> for (i = 0; i < len; i++) {</span> <span class='diff-add'> if ((dontConvert && array1[i] !== array2[i]) ||</span> <span class='diff-add'> (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {</span> <span class='diff-add'> diffs++;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return diffs + lengthDiff;</span> <span class='diff-add'> }</span> <span class='diff-add'> function normalizeUnits(units) {</span> <span class='diff-add'> if (units) {</span> <span class='diff-add'> var lowered = units.toLowerCase().replace(/(.)s$/, '$1');</span> <span class='diff-add'> units = unitAliases[units] || camelFunctions[lowered] || lowered;</span> <span class='diff-add'> }</span> <span class='diff-add'> return units;</span> <span class='diff-add'> }</span> <span class='diff-add'> function normalizeObjectUnits(inputObject) {</span> <span class='diff-add'> var normalizedInput = {},</span> <span class='diff-add'> normalizedProp,</span> <span class='diff-add'> prop;</span> <span class='diff-add'> for (prop in inputObject) {</span> <span class='diff-add'> if (hasOwnProp(inputObject, prop)) {</span> <span class='diff-add'> normalizedProp = normalizeUnits(prop);</span> <span class='diff-add'> if (normalizedProp) {</span> <span class='diff-add'> normalizedInput[normalizedProp] = inputObject[prop];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return normalizedInput;</span> <span class='diff-add'> }</span> <span class='diff-add'> function makeList(field) {</span> <span class='diff-add'> var count, setter;</span> <span class='diff-add'> if (field.indexOf('week') === 0) {</span> <span class='diff-add'> count = 7;</span> <span class='diff-add'> setter = 'day';</span> <span class='diff-add'> }</span> <span class='diff-add'> else if (field.indexOf('month') === 0) {</span> <span class='diff-add'> count = 12;</span> <span class='diff-add'> setter = 'month';</span> <span class='diff-add'> }</span> <span class='diff-add'> else {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> moment[field] = function (format, index) {</span> <span class='diff-add'> var i, getter,</span> <span class='diff-add'> method = moment._locale[field],</span> <span class='diff-add'> results = [];</span> <span class='diff-add'> if (typeof format === 'number') {</span> <span class='diff-add'> index = format;</span> <span class='diff-add'> format = undefined;</span> <span class='diff-add'> }</span> <span class='diff-add'> getter = function (i) {</span> <span class='diff-add'> var m = moment().utc().set(setter, i);</span> <span class='diff-add'> return method.call(moment._locale, m, format || '');</span> <span class='diff-add'> };</span> <span class='diff-add'> if (index != null) {</span> <span class='diff-add'> return getter(index);</span> <span class='diff-add'> }</span> <span class='diff-add'> else {</span> <span class='diff-add'> for (i = 0; i < count; i++) {</span> <span class='diff-add'> results.push(getter(i));</span> <span class='diff-add'> }</span> <span class='diff-add'> return results;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> function toInt(argumentForCoercion) {</span> <span class='diff-add'> var coercedNumber = +argumentForCoercion,</span> <span class='diff-add'> value = 0;</span> <span class='diff-add'> if (coercedNumber !== 0 && isFinite(coercedNumber)) {</span> <span class='diff-add'> if (coercedNumber >= 0) {</span> <span class='diff-add'> value = Math.floor(coercedNumber);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> value = Math.ceil(coercedNumber);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return value;</span> <span class='diff-add'> }</span> <span class='diff-add'> function daysInMonth(year, month) {</span> <span class='diff-add'> return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();</span> <span class='diff-add'> }</span> <span class='diff-add'> function weeksInYear(year, dow, doy) {</span> <span class='diff-add'> return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week;</span> <span class='diff-add'> }</span> <span class='diff-add'> function daysInYear(year) {</span> <span class='diff-add'> return isLeapYear(year) ? 366 : 365;</span> <span class='diff-add'> }</span> <span class='diff-add'> function isLeapYear(year) {</span> <span class='diff-add'> return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> function checkOverflow(m) {</span> <span class='diff-add'> var overflow;</span> <span class='diff-add'> if (m._a && m._pf.overflow === -2) {</span> <span class='diff-add'> overflow =</span> <span class='diff-add'> m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH :</span> <span class='diff-add'> m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE :</span> <span class='diff-add'> m._a[HOUR] < 0 || m._a[HOUR] > 24 ||</span> <span class='diff-add'> (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 ||</span> <span class='diff-add'> m._a[SECOND] !== 0 ||</span> <span class='diff-add'> m._a[MILLISECOND] !== 0)) ? HOUR :</span> <span class='diff-add'> m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE :</span> <span class='diff-add'> m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND :</span> <span class='diff-add'> m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND :</span> <span class='diff-add'> -1;</span> <span class='diff-add'> if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {</span> <span class='diff-add'> overflow = DATE;</span> <span class='diff-add'> }</span> <span class='diff-add'> m._pf.overflow = overflow;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function isValid(m) {</span> <span class='diff-add'> if (m._isValid == null) {</span> <span class='diff-add'> m._isValid = !isNaN(m._d.getTime()) &&</span> <span class='diff-add'> m._pf.overflow < 0 &&</span> <span class='diff-add'> !m._pf.empty &&</span> <span class='diff-add'> !m._pf.invalidMonth &&</span> <span class='diff-add'> !m._pf.nullInput &&</span> <span class='diff-add'> !m._pf.invalidFormat &&</span> <span class='diff-add'> !m._pf.userInvalidated;</span> <span class='diff-add'> if (m._strict) {</span> <span class='diff-add'> m._isValid = m._isValid &&</span> <span class='diff-add'> m._pf.charsLeftOver === 0 &&</span> <span class='diff-add'> m._pf.unusedTokens.length === 0 &&</span> <span class='diff-add'> m._pf.bigHour === undefined;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return m._isValid;</span> <span class='diff-add'> }</span> <span class='diff-add'> function normalizeLocale(key) {</span> <span class='diff-add'> return key ? key.toLowerCase().replace('_', '-') : key;</span> <span class='diff-add'> }</span> <span class='diff-add'> // pick the locale from the array</span> <span class='diff-add'> // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each</span> <span class='diff-add'> // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root</span> <span class='diff-add'> function chooseLocale(names) {</span> <span class='diff-add'> var i = 0, j, next, locale, split;</span> <span class='diff-add'> while (i < names.length) {</span> <span class='diff-add'> split = normalizeLocale(names[i]).split('-');</span> <span class='diff-add'> j = split.length;</span> <span class='diff-add'> next = normalizeLocale(names[i + 1]);</span> <span class='diff-add'> next = next ? next.split('-') : null;</span> <span class='diff-add'> while (j > 0) {</span> <span class='diff-add'> locale = loadLocale(split.slice(0, j).join('-'));</span> <span class='diff-add'> if (locale) {</span> <span class='diff-add'> return locale;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {</span> <span class='diff-add'> //the next array item is better than a shallower substring of this one</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> j--;</span> <span class='diff-add'> }</span> <span class='diff-add'> i++;</span> <span class='diff-add'> }</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> function loadLocale(name) {</span> <span class='diff-add'> var oldLocale = null;</span> <span class='diff-add'> if (!locales[name] && hasModule) {</span> <span class='diff-add'> try {</span> <span class='diff-add'> oldLocale = moment.locale();</span> <span class='diff-add'> require('./locale/' + name);</span> <span class='diff-add'> // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales</span> <span class='diff-add'> moment.locale(oldLocale);</span> <span class='diff-add'> } catch (e) { }</span> <span class='diff-add'> }</span> <span class='diff-add'> return locales[name];</span> <span class='diff-add'> }</span> <span class='diff-add'> // Return a moment from input, that is local/utc/zone equivalent to model.</span> <span class='diff-add'> function makeAs(input, model) {</span> <span class='diff-add'> var res, diff;</span> <span class='diff-add'> if (model._isUTC) {</span> <span class='diff-add'> res = model.clone();</span> <span class='diff-add'> diff = (moment.isMoment(input) || isDate(input) ?</span> <span class='diff-add'> +input : +moment(input)) - (+res);</span> <span class='diff-add'> // Use low-level api, because this fn is low-level api.</span> <span class='diff-add'> res._d.setTime(+res._d + diff);</span> <span class='diff-add'> moment.updateOffset(res, false);</span> <span class='diff-add'> return res;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return moment(input).local();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> /************************************</span> <span class='diff-add'> Locale</span> <span class='diff-add'> ************************************/</span> <span class='diff-add'> extend(Locale.prototype, {</span> <span class='diff-add'> set : function (config) {</span> <span class='diff-add'> var prop, i;</span> <span class='diff-add'> for (i in config) {</span> <span class='diff-add'> prop = config[i];</span> <span class='diff-add'> if (typeof prop === 'function') {</span> <span class='diff-add'> this[i] = prop;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this['_' + i] = prop;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Lenient ordinal parsing accepts just a number in addition to</span> <span class='diff-add'> // number + (possibly) stuff coming from _ordinalParseLenient.</span> <span class='diff-add'> this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source);</span> <span class='diff-add'> },</span> <span class='diff-add'> _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),</span> <span class='diff-add'> months : function (m) {</span> <span class='diff-add'> return this._months[m.month()];</span> <span class='diff-add'> },</span> <span class='diff-add'> _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),</span> <span class='diff-add'> monthsShort : function (m) {</span> <span class='diff-add'> return this._monthsShort[m.month()];</span> <span class='diff-add'> },</span> <span class='diff-add'> monthsParse : function (monthName, format, strict) {</span> <span class='diff-add'> var i, mom, regex;</span> <span class='diff-add'> if (!this._monthsParse) {</span> <span class='diff-add'> this._monthsParse = [];</span> <span class='diff-add'> this._longMonthsParse = [];</span> <span class='diff-add'> this._shortMonthsParse = [];</span> <span class='diff-add'> }</span> <span class='diff-add'> for (i = 0; i < 12; i++) {</span> <span class='diff-add'> // make the regex if we don't have it already</span> <span class='diff-add'> mom = moment.utc([2000, i]);</span> <span class='diff-add'> if (strict && !this._longMonthsParse[i]) {</span> <span class='diff-add'> this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');</span> <span class='diff-add'> this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!strict && !this._monthsParse[i]) {</span> <span class='diff-add'> regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');</span> <span class='diff-add'> this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');</span> <span class='diff-add'> }</span> <span class='diff-add'> // test the regex</span> <span class='diff-add'> if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {</span> <span class='diff-add'> return i;</span> <span class='diff-add'> } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {</span> <span class='diff-add'> return i;</span> <span class='diff-add'> } else if (!strict && this._monthsParse[i].test(monthName)) {</span> <span class='diff-add'> return i;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),</span> <span class='diff-add'> weekdays : function (m) {</span> <span class='diff-add'> return this._weekdays[m.day()];</span> <span class='diff-add'> },</span> <span class='diff-add'> _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),</span> <span class='diff-add'> weekdaysShort : function (m) {</span> <span class='diff-add'> return this._weekdaysShort[m.day()];</span> <span class='diff-add'> },</span> <span class='diff-add'> _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),</span> <span class='diff-add'> weekdaysMin : function (m) {</span> <span class='diff-add'> return this._weekdaysMin[m.day()];</span> <span class='diff-add'> },</span> <span class='diff-add'> weekdaysParse : function (weekdayName) {</span> <span class='diff-add'> var i, mom, regex;</span> <span class='diff-add'> if (!this._weekdaysParse) {</span> <span class='diff-add'> this._weekdaysParse = [];</span> <span class='diff-add'> }</span> <span class='diff-add'> for (i = 0; i < 7; i++) {</span> <span class='diff-add'> // make the regex if we don't have it already</span> <span class='diff-add'> if (!this._weekdaysParse[i]) {</span> <span class='diff-add'> mom = moment([2000, 1]).day(i);</span> <span class='diff-add'> regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');</span> <span class='diff-add'> this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');</span> <span class='diff-add'> }</span> <span class='diff-add'> // test the regex</span> <span class='diff-add'> if (this._weekdaysParse[i].test(weekdayName)) {</span> <span class='diff-add'> return i;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> _longDateFormat : {</span> <span class='diff-add'> LTS : 'h:mm:ss A',</span> <span class='diff-add'> LT : 'h:mm A',</span> <span class='diff-add'> L : 'MM/DD/YYYY',</span> <span class='diff-add'> LL : 'MMMM D, YYYY',</span> <span class='diff-add'> LLL : 'MMMM D, YYYY LT',</span> <span class='diff-add'> LLLL : 'dddd, MMMM D, YYYY LT'</span> <span class='diff-add'> },</span> <span class='diff-add'> longDateFormat : function (key) {</span> <span class='diff-add'> var output = this._longDateFormat[key];</span> <span class='diff-add'> if (!output && this._longDateFormat[key.toUpperCase()]) {</span> <span class='diff-add'> output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) {</span> <span class='diff-add'> return val.slice(1);</span> <span class='diff-add'> });</span> <span class='diff-add'> this._longDateFormat[key] = output;</span> <span class='diff-add'> }</span> <span class='diff-add'> return output;</span> <span class='diff-add'> },</span> <span class='diff-add'> isPM : function (input) {</span> <span class='diff-add'> // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays</span> <span class='diff-add'> // Using charAt should be more compatible.</span> <span class='diff-add'> return ((input + '').toLowerCase().charAt(0) === 'p');</span> <span class='diff-add'> },</span> <span class='diff-add'> _meridiemParse : /[ap]\.?m?\.?/i,</span> <span class='diff-add'> meridiem : function (hours, minutes, isLower) {</span> <span class='diff-add'> if (hours > 11) {</span> <span class='diff-add'> return isLower ? 'pm' : 'PM';</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return isLower ? 'am' : 'AM';</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> _calendar : {</span> <span class='diff-add'> sameDay : '[Today at] LT',</span> <span class='diff-add'> nextDay : '[Tomorrow at] LT',</span> <span class='diff-add'> nextWeek : 'dddd [at] LT',</span> <span class='diff-add'> lastDay : '[Yesterday at] LT',</span> <span class='diff-add'> lastWeek : '[Last] dddd [at] LT',</span> <span class='diff-add'> sameElse : 'L'</span> <span class='diff-add'> },</span> <span class='diff-add'> calendar : function (key, mom, now) {</span> <span class='diff-add'> var output = this._calendar[key];</span> <span class='diff-add'> return typeof output === 'function' ? output.apply(mom, [now]) : output;</span> <span class='diff-add'> },</span> <span class='diff-add'> _relativeTime : {</span> <span class='diff-add'> future : 'in %s',</span> <span class='diff-add'> past : '%s ago',</span> <span class='diff-add'> s : 'a few seconds',</span> <span class='diff-add'> m : 'a minute',</span> <span class='diff-add'> mm : '%d minutes',</span> <span class='diff-add'> h : 'an hour',</span> <span class='diff-add'> hh : '%d hours',</span> <span class='diff-add'> d : 'a day',</span> <span class='diff-add'> dd : '%d days',</span> <span class='diff-add'> M : 'a month',</span> <span class='diff-add'> MM : '%d months',</span> <span class='diff-add'> y : 'a year',</span> <span class='diff-add'> yy : '%d years'</span> <span class='diff-add'> },</span> <span class='diff-add'> relativeTime : function (number, withoutSuffix, string, isFuture) {</span> <span class='diff-add'> var output = this._relativeTime[string];</span> <span class='diff-add'> return (typeof output === 'function') ?</span> <span class='diff-add'> output(number, withoutSuffix, string, isFuture) :</span> <span class='diff-add'> output.replace(/%d/i, number);</span> <span class='diff-add'> },</span> <span class='diff-add'> pastFuture : function (diff, output) {</span> <span class='diff-add'> var format = this._relativeTime[diff > 0 ? 'future' : 'past'];</span> <span class='diff-add'> return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);</span> <span class='diff-add'> },</span> <span class='diff-add'> ordinal : function (number) {</span> <span class='diff-add'> return this._ordinal.replace('%d', number);</span> <span class='diff-add'> },</span> <span class='diff-add'> _ordinal : '%d',</span> <span class='diff-add'> _ordinalParse : /\d{1,2}/,</span> <span class='diff-add'> preparse : function (string) {</span> <span class='diff-add'> return string;</span> <span class='diff-add'> },</span> <span class='diff-add'> postformat : function (string) {</span> <span class='diff-add'> return string;</span> <span class='diff-add'> },</span> <span class='diff-add'> week : function (mom) {</span> <span class='diff-add'> return weekOfYear(mom, this._week.dow, this._week.doy).week;</span> <span class='diff-add'> },</span> <span class='diff-add'> _week : {</span> <span class='diff-add'> dow : 0, // Sunday is the first day of the week.</span> <span class='diff-add'> doy : 6 // The week that contains Jan 1st is the first week of the year.</span> <span class='diff-add'> },</span> <span class='diff-add'> _invalidDate: 'Invalid date',</span> <span class='diff-add'> invalidDate: function () {</span> <span class='diff-add'> return this._invalidDate;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> /************************************</span> <span class='diff-add'> Formatting</span> <span class='diff-add'> ************************************/</span> <span class='diff-add'> function removeFormattingTokens(input) {</span> <span class='diff-add'> if (input.match(/\[[\s\S]/)) {</span> <span class='diff-add'> return input.replace(/^\[|\]$/g, '');</span> <span class='diff-add'> }</span> <span class='diff-add'> return input.replace(/\\/g, '');</span> <span class='diff-add'> }</span> <span class='diff-add'> function makeFormatFunction(format) {</span> <span class='diff-add'> var array = format.match(formattingTokens), i, length;</span> <span class='diff-add'> for (i = 0, length = array.length; i < length; i++) {</span> <span class='diff-add'> if (formatTokenFunctions[array[i]]) {</span> <span class='diff-add'> array[i] = formatTokenFunctions[array[i]];</span> <span class='diff-add'> } else {</span> <span class='diff-add'> array[i] = removeFormattingTokens(array[i]);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return function (mom) {</span> <span class='diff-add'> var output = '';</span> <span class='diff-add'> for (i = 0; i < length; i++) {</span> <span class='diff-add'> output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];</span> <span class='diff-add'> }</span> <span class='diff-add'> return output;</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> // format date using native date object</span> <span class='diff-add'> function formatMoment(m, format) {</span> <span class='diff-add'> if (!m.isValid()) {</span> <span class='diff-add'> return m.localeData().invalidDate();</span> <span class='diff-add'> }</span> <span class='diff-add'> format = expandFormat(format, m.localeData());</span> <span class='diff-add'> if (!formatFunctions[format]) {</span> <span class='diff-add'> formatFunctions[format] = makeFormatFunction(format);</span> <span class='diff-add'> }</span> <span class='diff-add'> return formatFunctions[format](m);</span> <span class='diff-add'> }</span> <span class='diff-add'> function expandFormat(format, locale) {</span> <span class='diff-add'> var i = 5;</span> <span class='diff-add'> function replaceLongDateFormatTokens(input) {</span> <span class='diff-add'> return locale.longDateFormat(input) || input;</span> <span class='diff-add'> }</span> <span class='diff-add'> localFormattingTokens.lastIndex = 0;</span> <span class='diff-add'> while (i >= 0 && localFormattingTokens.test(format)) {</span> <span class='diff-add'> format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);</span> <span class='diff-add'> localFormattingTokens.lastIndex = 0;</span> <span class='diff-add'> i -= 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> return format;</span> <span class='diff-add'> }</span> <span class='diff-add'> /************************************</span> <span class='diff-add'> Parsing</span> <span class='diff-add'> ************************************/</span> <span class='diff-add'> // get the regex to find the next token</span> <span class='diff-add'> function getParseRegexForToken(token, config) {</span> <span class='diff-add'> var a, strict = config._strict;</span> <span class='diff-add'> switch (token) {</span> <span class='diff-add'> case 'Q':</span> <span class='diff-add'> return parseTokenOneDigit;</span> <span class='diff-add'> case 'DDDD':</span> <span class='diff-add'> return parseTokenThreeDigits;</span> <span class='diff-add'> case 'YYYY':</span> <span class='diff-add'> case 'GGGG':</span> <span class='diff-add'> case 'gggg':</span> <span class='diff-add'> return strict ? parseTokenFourDigits : parseTokenOneToFourDigits;</span> <span class='diff-add'> case 'Y':</span> <span class='diff-add'> case 'G':</span> <span class='diff-add'> case 'g':</span> <span class='diff-add'> return parseTokenSignedNumber;</span> <span class='diff-add'> case 'YYYYYY':</span> <span class='diff-add'> case 'YYYYY':</span> <span class='diff-add'> case 'GGGGG':</span> <span class='diff-add'> case 'ggggg':</span> <span class='diff-add'> return strict ? parseTokenSixDigits : parseTokenOneToSixDigits;</span> <span class='diff-add'> case 'S':</span> <span class='diff-add'> if (strict) {</span> <span class='diff-add'> return parseTokenOneDigit;</span> <span class='diff-add'> }</span> <span class='diff-add'> /* falls through */</span> <span class='diff-add'> case 'SS':</span> <span class='diff-add'> if (strict) {</span> <span class='diff-add'> return parseTokenTwoDigits;</span> <span class='diff-add'> }</span> <span class='diff-add'> /* falls through */</span> <span class='diff-add'> case 'SSS':</span> <span class='diff-add'> if (strict) {</span> <span class='diff-add'> return parseTokenThreeDigits;</span> <span class='diff-add'> }</span> <span class='diff-add'> /* falls through */</span> <span class='diff-add'> case 'DDD':</span> <span class='diff-add'> return parseTokenOneToThreeDigits;</span> <span class='diff-add'> case 'MMM':</span> <span class='diff-add'> case 'MMMM':</span> <span class='diff-add'> case 'dd':</span> <span class='diff-add'> case 'ddd':</span> <span class='diff-add'> case 'dddd':</span> <span class='diff-add'> return parseTokenWord;</span> <span class='diff-add'> case 'a':</span> <span class='diff-add'> case 'A':</span> <span class='diff-add'> return config._locale._meridiemParse;</span> <span class='diff-add'> case 'x':</span> <span class='diff-add'> return parseTokenOffsetMs;</span> <span class='diff-add'> case 'X':</span> <span class='diff-add'> return parseTokenTimestampMs;</span> <span class='diff-add'> case 'Z':</span> <span class='diff-add'> case 'ZZ':</span> <span class='diff-add'> return parseTokenTimezone;</span> <span class='diff-add'> case 'T':</span> <span class='diff-add'> return parseTokenT;</span> <span class='diff-add'> case 'SSSS':</span> <span class='diff-add'> return parseTokenDigits;</span> <span class='diff-add'> case 'MM':</span> <span class='diff-add'> case 'DD':</span> <span class='diff-add'> case 'YY':</span> <span class='diff-add'> case 'GG':</span> <span class='diff-add'> case 'gg':</span> <span class='diff-add'> case 'HH':</span> <span class='diff-add'> case 'hh':</span> <span class='diff-add'> case 'mm':</span> <span class='diff-add'> case 'ss':</span> <span class='diff-add'> case 'ww':</span> <span class='diff-add'> case 'WW':</span> <span class='diff-add'> return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits;</span> <span class='diff-add'> case 'M':</span> <span class='diff-add'> case 'D':</span> <span class='diff-add'> case 'd':</span> <span class='diff-add'> case 'H':</span> <span class='diff-add'> case 'h':</span> <span class='diff-add'> case 'm':</span> <span class='diff-add'> case 's':</span> <span class='diff-add'> case 'w':</span> <span class='diff-add'> case 'W':</span> <span class='diff-add'> case 'e':</span> <span class='diff-add'> case 'E':</span> <span class='diff-add'> return parseTokenOneOrTwoDigits;</span> <span class='diff-add'> case 'Do':</span> <span class='diff-add'> return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient;</span> <span class='diff-add'> default :</span> <span class='diff-add'> a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i'));</span> <span class='diff-add'> return a;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function timezoneMinutesFromString(string) {</span> <span class='diff-add'> string = string || '';</span> <span class='diff-add'> var possibleTzMatches = (string.match(parseTokenTimezone) || []),</span> <span class='diff-add'> tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [],</span> <span class='diff-add'> parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0],</span> <span class='diff-add'> minutes = +(parts[1] * 60) + toInt(parts[2]);</span> <span class='diff-add'> return parts[0] === '+' ? -minutes : minutes;</span> <span class='diff-add'> }</span> <span class='diff-add'> // function to convert string input to date</span> <span class='diff-add'> function addTimeToArrayFromToken(token, input, config) {</span> <span class='diff-add'> var a, datePartArray = config._a;</span> <span class='diff-add'> switch (token) {</span> <span class='diff-add'> // QUARTER</span> <span class='diff-add'> case 'Q':</span> <span class='diff-add'> if (input != null) {</span> <span class='diff-add'> datePartArray[MONTH] = (toInt(input) - 1) * 3;</span> <span class='diff-add'> }</span> <span class='diff-add'> break;</span> <span class='diff-add'> // MONTH</span> <span class='diff-add'> case 'M' : // fall through to MM</span> <span class='diff-add'> case 'MM' :</span> <span class='diff-add'> if (input != null) {</span> <span class='diff-add'> datePartArray[MONTH] = toInt(input) - 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'MMM' : // fall through to MMMM</span> <span class='diff-add'> case 'MMMM' :</span> <span class='diff-add'> a = config._locale.monthsParse(input, token, config._strict);</span> <span class='diff-add'> // if we didn't find a month name, mark the date as invalid.</span> <span class='diff-add'> if (a != null) {</span> <span class='diff-add'> datePartArray[MONTH] = a;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> config._pf.invalidMonth = input;</span> <span class='diff-add'> }</span> <span class='diff-add'> break;</span> <span class='diff-add'> // DAY OF MONTH</span> <span class='diff-add'> case 'D' : // fall through to DD</span> <span class='diff-add'> case 'DD' :</span> <span class='diff-add'> if (input != null) {</span> <span class='diff-add'> datePartArray[DATE] = toInt(input);</span> <span class='diff-add'> }</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'Do' :</span> <span class='diff-add'> if (input != null) {</span> <span class='diff-add'> datePartArray[DATE] = toInt(parseInt(</span> <span class='diff-add'> input.match(/\d{1,2}/)[0], 10));</span> <span class='diff-add'> }</span> <span class='diff-add'> break;</span> <span class='diff-add'> // DAY OF YEAR</span> <span class='diff-add'> case 'DDD' : // fall through to DDDD</span> <span class='diff-add'> case 'DDDD' :</span> <span class='diff-add'> if (input != null) {</span> <span class='diff-add'> config._dayOfYear = toInt(input);</span> <span class='diff-add'> }</span> <span class='diff-add'> break;</span> <span class='diff-add'> // YEAR</span> <span class='diff-add'> case 'YY' :</span> <span class='diff-add'> datePartArray[YEAR] = moment.parseTwoDigitYear(input);</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'YYYY' :</span> <span class='diff-add'> case 'YYYYY' :</span> <span class='diff-add'> case 'YYYYYY' :</span> <span class='diff-add'> datePartArray[YEAR] = toInt(input);</span> <span class='diff-add'> break;</span> <span class='diff-add'> // AM / PM</span> <span class='diff-add'> case 'a' : // fall through to A</span> <span class='diff-add'> case 'A' :</span> <span class='diff-add'> config._isPm = config._locale.isPM(input);</span> <span class='diff-add'> break;</span> <span class='diff-add'> // HOUR</span> <span class='diff-add'> case 'h' : // fall through to hh</span> <span class='diff-add'> case 'hh' :</span> <span class='diff-add'> config._pf.bigHour = true;</span> <span class='diff-add'> /* falls through */</span> <span class='diff-add'> case 'H' : // fall through to HH</span> <span class='diff-add'> case 'HH' :</span> <span class='diff-add'> datePartArray[HOUR] = toInt(input);</span> <span class='diff-add'> break;</span> <span class='diff-add'> // MINUTE</span> <span class='diff-add'> case 'm' : // fall through to mm</span> <span class='diff-add'> case 'mm' :</span> <span class='diff-add'> datePartArray[MINUTE] = toInt(input);</span> <span class='diff-add'> break;</span> <span class='diff-add'> // SECOND</span> <span class='diff-add'> case 's' : // fall through to ss</span> <span class='diff-add'> case 'ss' :</span> <span class='diff-add'> datePartArray[SECOND] = toInt(input);</span> <span class='diff-add'> break;</span> <span class='diff-add'> // MILLISECOND</span> <span class='diff-add'> case 'S' :</span> <span class='diff-add'> case 'SS' :</span> <span class='diff-add'> case 'SSS' :</span> <span class='diff-add'> case 'SSSS' :</span> <span class='diff-add'> datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000);</span> <span class='diff-add'> break;</span> <span class='diff-add'> // UNIX OFFSET (MILLISECONDS)</span> <span class='diff-add'> case 'x':</span> <span class='diff-add'> config._d = new Date(toInt(input));</span> <span class='diff-add'> break;</span> <span class='diff-add'> // UNIX TIMESTAMP WITH MS</span> <span class='diff-add'> case 'X':</span> <span class='diff-add'> config._d = new Date(parseFloat(input) * 1000);</span> <span class='diff-add'> break;</span> <span class='diff-add'> // TIMEZONE</span> <span class='diff-add'> case 'Z' : // fall through to ZZ</span> <span class='diff-add'> case 'ZZ' :</span> <span class='diff-add'> config._useUTC = true;</span> <span class='diff-add'> config._tzm = timezoneMinutesFromString(input);</span> <span class='diff-add'> break;</span> <span class='diff-add'> // WEEKDAY - human</span> <span class='diff-add'> case 'dd':</span> <span class='diff-add'> case 'ddd':</span> <span class='diff-add'> case 'dddd':</span> <span class='diff-add'> a = config._locale.weekdaysParse(input);</span> <span class='diff-add'> // if we didn't get a weekday name, mark the date as invalid</span> <span class='diff-add'> if (a != null) {</span> <span class='diff-add'> config._w = config._w || {};</span> <span class='diff-add'> config._w['d'] = a;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> config._pf.invalidWeekday = input;</span> <span class='diff-add'> }</span> <span class='diff-add'> break;</span> <span class='diff-add'> // WEEK, WEEK DAY - numeric</span> <span class='diff-add'> case 'w':</span> <span class='diff-add'> case 'ww':</span> <span class='diff-add'> case 'W':</span> <span class='diff-add'> case 'WW':</span> <span class='diff-add'> case 'd':</span> <span class='diff-add'> case 'e':</span> <span class='diff-add'> case 'E':</span> <span class='diff-add'> token = token.substr(0, 1);</span> <span class='diff-add'> /* falls through */</span> <span class='diff-add'> case 'gggg':</span> <span class='diff-add'> case 'GGGG':</span> <span class='diff-add'> case 'GGGGG':</span> <span class='diff-add'> token = token.substr(0, 2);</span> <span class='diff-add'> if (input) {</span> <span class='diff-add'> config._w = config._w || {};</span> <span class='diff-add'> config._w[token] = toInt(input);</span> <span class='diff-add'> }</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'gg':</span> <span class='diff-add'> case 'GG':</span> <span class='diff-add'> config._w = config._w || {};</span> <span class='diff-add'> config._w[token] = moment.parseTwoDigitYear(input);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function dayOfYearFromWeekInfo(config) {</span> <span class='diff-add'> var w, weekYear, week, weekday, dow, doy, temp;</span> <span class='diff-add'> w = config._w;</span> <span class='diff-add'> if (w.GG != null || w.W != null || w.E != null) {</span> <span class='diff-add'> dow = 1;</span> <span class='diff-add'> doy = 4;</span> <span class='diff-add'> // TODO: We need to take the current isoWeekYear, but that depends on</span> <span class='diff-add'> // how we interpret now (local, utc, fixed offset). So create</span> <span class='diff-add'> // a now version of current config (take local/utc/offset flags, and</span> <span class='diff-add'> // create now).</span> <span class='diff-add'> weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year);</span> <span class='diff-add'> week = dfl(w.W, 1);</span> <span class='diff-add'> weekday = dfl(w.E, 1);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> dow = config._locale._week.dow;</span> <span class='diff-add'> doy = config._locale._week.doy;</span> <span class='diff-add'> weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year);</span> <span class='diff-add'> week = dfl(w.w, 1);</span> <span class='diff-add'> if (w.d != null) {</span> <span class='diff-add'> // weekday -- low day numbers are considered next week</span> <span class='diff-add'> weekday = w.d;</span> <span class='diff-add'> if (weekday < dow) {</span> <span class='diff-add'> ++week;</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (w.e != null) {</span> <span class='diff-add'> // local weekday -- counting starts from begining of week</span> <span class='diff-add'> weekday = w.e + dow;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // default to begining of week</span> <span class='diff-add'> weekday = dow;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow);</span> <span class='diff-add'> config._a[YEAR] = temp.year;</span> <span class='diff-add'> config._dayOfYear = temp.dayOfYear;</span> <span class='diff-add'> }</span> <span class='diff-add'> // convert an array to a date.</span> <span class='diff-add'> // the array should mirror the parameters below</span> <span class='diff-add'> // note: all values past the year are optional and will default to the lowest possible value.</span> <span class='diff-add'> // [year, month, day , hour, minute, second, millisecond]</span> <span class='diff-add'> function dateFromConfig(config) {</span> <span class='diff-add'> var i, date, input = [], currentDate, yearToUse;</span> <span class='diff-add'> if (config._d) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> currentDate = currentDateArray(config);</span> <span class='diff-add'> //compute day of the year from weeks and weekdays</span> <span class='diff-add'> if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {</span> <span class='diff-add'> dayOfYearFromWeekInfo(config);</span> <span class='diff-add'> }</span> <span class='diff-add'> //if the day of the year is set, figure out what it is</span> <span class='diff-add'> if (config._dayOfYear) {</span> <span class='diff-add'> yearToUse = dfl(config._a[YEAR], currentDate[YEAR]);</span> <span class='diff-add'> if (config._dayOfYear > daysInYear(yearToUse)) {</span> <span class='diff-add'> config._pf._overflowDayOfYear = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> date = makeUTCDate(yearToUse, 0, config._dayOfYear);</span> <span class='diff-add'> config._a[MONTH] = date.getUTCMonth();</span> <span class='diff-add'> config._a[DATE] = date.getUTCDate();</span> <span class='diff-add'> }</span> <span class='diff-add'> // Default to current date.</span> <span class='diff-add'> // * if no year, month, day of month are given, default to today</span> <span class='diff-add'> // * if day of month is given, default month and year</span> <span class='diff-add'> // * if month is given, default only year</span> <span class='diff-add'> // * if year is given, don't default anything</span> <span class='diff-add'> for (i = 0; i < 3 && config._a[i] == null; ++i) {</span> <span class='diff-add'> config._a[i] = input[i] = currentDate[i];</span> <span class='diff-add'> }</span> <span class='diff-add'> // Zero out whatever was not defaulted, including time</span> <span class='diff-add'> for (; i < 7; i++) {</span> <span class='diff-add'> config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];</span> <span class='diff-add'> }</span> <span class='diff-add'> // Check for 24:00:00.000</span> <span class='diff-add'> if (config._a[HOUR] === 24 &&</span> <span class='diff-add'> config._a[MINUTE] === 0 &&</span> <span class='diff-add'> config._a[SECOND] === 0 &&</span> <span class='diff-add'> config._a[MILLISECOND] === 0) {</span> <span class='diff-add'> config._nextDay = true;</span> <span class='diff-add'> config._a[HOUR] = 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input);</span> <span class='diff-add'> // Apply timezone offset from input. The actual zone can be changed</span> <span class='diff-add'> // with parseZone.</span> <span class='diff-add'> if (config._tzm != null) {</span> <span class='diff-add'> config._d.setUTCMinutes(config._d.getUTCMinutes() + config._tzm);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (config._nextDay) {</span> <span class='diff-add'> config._a[HOUR] = 24;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function dateFromObject(config) {</span> <span class='diff-add'> var normalizedInput;</span> <span class='diff-add'> if (config._d) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> normalizedInput = normalizeObjectUnits(config._i);</span> <span class='diff-add'> config._a = [</span> <span class='diff-add'> normalizedInput.year,</span> <span class='diff-add'> normalizedInput.month,</span> <span class='diff-add'> normalizedInput.day || normalizedInput.date,</span> <span class='diff-add'> normalizedInput.hour,</span> <span class='diff-add'> normalizedInput.minute,</span> <span class='diff-add'> normalizedInput.second,</span> <span class='diff-add'> normalizedInput.millisecond</span> <span class='diff-add'> ];</span> <span class='diff-add'> dateFromConfig(config);</span> <span class='diff-add'> }</span> <span class='diff-add'> function currentDateArray(config) {</span> <span class='diff-add'> var now = new Date();</span> <span class='diff-add'> if (config._useUTC) {</span> <span class='diff-add'> return [</span> <span class='diff-add'> now.getUTCFullYear(),</span> <span class='diff-add'> now.getUTCMonth(),</span> <span class='diff-add'> now.getUTCDate()</span> <span class='diff-add'> ];</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return [now.getFullYear(), now.getMonth(), now.getDate()];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // date from string and format string</span> <span class='diff-add'> function makeDateFromStringAndFormat(config) {</span> <span class='diff-add'> if (config._f === moment.ISO_8601) {</span> <span class='diff-add'> parseISO(config);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> config._a = [];</span> <span class='diff-add'> config._pf.empty = true;</span> <span class='diff-add'> // This array is used to make a Date, either with `new Date` or `Date.UTC`</span> <span class='diff-add'> var string = '' + config._i,</span> <span class='diff-add'> i, parsedInput, tokens, token, skipped,</span> <span class='diff-add'> stringLength = string.length,</span> <span class='diff-add'> totalParsedInputLength = 0;</span> <span class='diff-add'> tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];</span> <span class='diff-add'> for (i = 0; i < tokens.length; i++) {</span> <span class='diff-add'> token = tokens[i];</span> <span class='diff-add'> parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];</span> <span class='diff-add'> if (parsedInput) {</span> <span class='diff-add'> skipped = string.substr(0, string.indexOf(parsedInput));</span> <span class='diff-add'> if (skipped.length > 0) {</span> <span class='diff-add'> config._pf.unusedInput.push(skipped);</span> <span class='diff-add'> }</span> <span class='diff-add'> string = string.slice(string.indexOf(parsedInput) + parsedInput.length);</span> <span class='diff-add'> totalParsedInputLength += parsedInput.length;</span> <span class='diff-add'> }</span> <span class='diff-add'> // don't parse if it's not a known token</span> <span class='diff-add'> if (formatTokenFunctions[token]) {</span> <span class='diff-add'> if (parsedInput) {</span> <span class='diff-add'> config._pf.empty = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> else {</span> <span class='diff-add'> config._pf.unusedTokens.push(token);</span> <span class='diff-add'> }</span> <span class='diff-add'> addTimeToArrayFromToken(token, parsedInput, config);</span> <span class='diff-add'> }</span> <span class='diff-add'> else if (config._strict && !parsedInput) {</span> <span class='diff-add'> config._pf.unusedTokens.push(token);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // add remaining unparsed input length to the string</span> <span class='diff-add'> config._pf.charsLeftOver = stringLength - totalParsedInputLength;</span> <span class='diff-add'> if (string.length > 0) {</span> <span class='diff-add'> config._pf.unusedInput.push(string);</span> <span class='diff-add'> }</span> <span class='diff-add'> // clear _12h flag if hour is <= 12</span> <span class='diff-add'> if (config._pf.bigHour === true && config._a[HOUR] <= 12) {</span> <span class='diff-add'> config._pf.bigHour = undefined;</span> <span class='diff-add'> }</span> <span class='diff-add'> // handle am pm</span> <span class='diff-add'> if (config._isPm && config._a[HOUR] < 12) {</span> <span class='diff-add'> config._a[HOUR] += 12;</span> <span class='diff-add'> }</span> <span class='diff-add'> // if is 12 am, change hours to 0</span> <span class='diff-add'> if (config._isPm === false && config._a[HOUR] === 12) {</span> <span class='diff-add'> config._a[HOUR] = 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> dateFromConfig(config);</span> <span class='diff-add'> checkOverflow(config);</span> <span class='diff-add'> }</span> <span class='diff-add'> function unescapeFormat(s) {</span> <span class='diff-add'> return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {</span> <span class='diff-add'> return p1 || p2 || p3 || p4;</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript</span> <span class='diff-add'> function regexpEscape(s) {</span> <span class='diff-add'> return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');</span> <span class='diff-add'> }</span> <span class='diff-add'> // date from string and array of format strings</span> <span class='diff-add'> function makeDateFromStringAndArray(config) {</span> <span class='diff-add'> var tempConfig,</span> <span class='diff-add'> bestMoment,</span> <span class='diff-add'> scoreToBeat,</span> <span class='diff-add'> i,</span> <span class='diff-add'> currentScore;</span> <span class='diff-add'> if (config._f.length === 0) {</span> <span class='diff-add'> config._pf.invalidFormat = true;</span> <span class='diff-add'> config._d = new Date(NaN);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> for (i = 0; i < config._f.length; i++) {</span> <span class='diff-add'> currentScore = 0;</span> <span class='diff-add'> tempConfig = copyConfig({}, config);</span> <span class='diff-add'> if (config._useUTC != null) {</span> <span class='diff-add'> tempConfig._useUTC = config._useUTC;</span> <span class='diff-add'> }</span> <span class='diff-add'> tempConfig._pf = defaultParsingFlags();</span> <span class='diff-add'> tempConfig._f = config._f[i];</span> <span class='diff-add'> makeDateFromStringAndFormat(tempConfig);</span> <span class='diff-add'> if (!isValid(tempConfig)) {</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> // if there is any input that was not parsed add a penalty for that format</span> <span class='diff-add'> currentScore += tempConfig._pf.charsLeftOver;</span> <span class='diff-add'> //or tokens</span> <span class='diff-add'> currentScore += tempConfig._pf.unusedTokens.length * 10;</span> <span class='diff-add'> tempConfig._pf.score = currentScore;</span> <span class='diff-add'> if (scoreToBeat == null || currentScore < scoreToBeat) {</span> <span class='diff-add'> scoreToBeat = currentScore;</span> <span class='diff-add'> bestMoment = tempConfig;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> extend(config, bestMoment || tempConfig);</span> <span class='diff-add'> }</span> <span class='diff-add'> // date from iso format</span> <span class='diff-add'> function parseISO(config) {</span> <span class='diff-add'> var i, l,</span> <span class='diff-add'> string = config._i,</span> <span class='diff-add'> match = isoRegex.exec(string);</span> <span class='diff-add'> if (match) {</span> <span class='diff-add'> config._pf.iso = true;</span> <span class='diff-add'> for (i = 0, l = isoDates.length; i < l; i++) {</span> <span class='diff-add'> if (isoDates[i][1].exec(string)) {</span> <span class='diff-add'> // match[5] should be 'T' or undefined</span> <span class='diff-add'> config._f = isoDates[i][0] + (match[6] || ' ');</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> for (i = 0, l = isoTimes.length; i < l; i++) {</span> <span class='diff-add'> if (isoTimes[i][1].exec(string)) {</span> <span class='diff-add'> config._f += isoTimes[i][0];</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (string.match(parseTokenTimezone)) {</span> <span class='diff-add'> config._f += 'Z';</span> <span class='diff-add'> }</span> <span class='diff-add'> makeDateFromStringAndFormat(config);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> config._isValid = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // date from iso format or fallback</span> <span class='diff-add'> function makeDateFromString(config) {</span> <span class='diff-add'> parseISO(config);</span> <span class='diff-add'> if (config._isValid === false) {</span> <span class='diff-add'> delete config._isValid;</span> <span class='diff-add'> moment.createFromInputFallback(config);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function map(arr, fn) {</span> <span class='diff-add'> var res = [], i;</span> <span class='diff-add'> for (i = 0; i < arr.length; ++i) {</span> <span class='diff-add'> res.push(fn(arr[i], i));</span> <span class='diff-add'> }</span> <span class='diff-add'> return res;</span> <span class='diff-add'> }</span> <span class='diff-add'> function makeDateFromInput(config) {</span> <span class='diff-add'> var input = config._i, matched;</span> <span class='diff-add'> if (input === undefined) {</span> <span class='diff-add'> config._d = new Date();</span> <span class='diff-add'> } else if (isDate(input)) {</span> <span class='diff-add'> config._d = new Date(+input);</span> <span class='diff-add'> } else if ((matched = aspNetJsonRegex.exec(input)) !== null) {</span> <span class='diff-add'> config._d = new Date(+matched[1]);</span> <span class='diff-add'> } else if (typeof input === 'string') {</span> <span class='diff-add'> makeDateFromString(config);</span> <span class='diff-add'> } else if (isArray(input)) {</span> <span class='diff-add'> config._a = map(input.slice(0), function (obj) {</span> <span class='diff-add'> return parseInt(obj, 10);</span> <span class='diff-add'> });</span> <span class='diff-add'> dateFromConfig(config);</span> <span class='diff-add'> } else if (typeof(input) === 'object') {</span> <span class='diff-add'> dateFromObject(config);</span> <span class='diff-add'> } else if (typeof(input) === 'number') {</span> <span class='diff-add'> // from milliseconds</span> <span class='diff-add'> config._d = new Date(input);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> moment.createFromInputFallback(config);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function makeDate(y, m, d, h, M, s, ms) {</span> <span class='diff-add'> //can't just apply() to create a date:</span> <span class='diff-add'> //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply</span> <span class='diff-add'> var date = new Date(y, m, d, h, M, s, ms);</span> <span class='diff-add'> //the date constructor doesn't accept years < 1970</span> <span class='diff-add'> if (y < 1970) {</span> <span class='diff-add'> date.setFullYear(y);</span> <span class='diff-add'> }</span> <span class='diff-add'> return date;</span> <span class='diff-add'> }</span> <span class='diff-add'> function makeUTCDate(y) {</span> <span class='diff-add'> var date = new Date(Date.UTC.apply(null, arguments));</span> <span class='diff-add'> if (y < 1970) {</span> <span class='diff-add'> date.setUTCFullYear(y);</span> <span class='diff-add'> }</span> <span class='diff-add'> return date;</span> <span class='diff-add'> }</span> <span class='diff-add'> function parseWeekday(input, locale) {</span> <span class='diff-add'> if (typeof input === 'string') {</span> <span class='diff-add'> if (!isNaN(input)) {</span> <span class='diff-add'> input = parseInt(input, 10);</span> <span class='diff-add'> }</span> <span class='diff-add'> else {</span> <span class='diff-add'> input = locale.weekdaysParse(input);</span> <span class='diff-add'> if (typeof input !== 'number') {</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return input;</span> <span class='diff-add'> }</span> <span class='diff-add'> /************************************</span> <span class='diff-add'> Relative Time</span> <span class='diff-add'> ************************************/</span> <span class='diff-add'> // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize</span> <span class='diff-add'> function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {</span> <span class='diff-add'> return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);</span> <span class='diff-add'> }</span> <span class='diff-add'> function relativeTime(posNegDuration, withoutSuffix, locale) {</span> <span class='diff-add'> var duration = moment.duration(posNegDuration).abs(),</span> <span class='diff-add'> seconds = round(duration.as('s')),</span> <span class='diff-add'> minutes = round(duration.as('m')),</span> <span class='diff-add'> hours = round(duration.as('h')),</span> <span class='diff-add'> days = round(duration.as('d')),</span> <span class='diff-add'> months = round(duration.as('M')),</span> <span class='diff-add'> years = round(duration.as('y')),</span> <span class='diff-add'> args = seconds < relativeTimeThresholds.s && ['s', seconds] ||</span> <span class='diff-add'> minutes === 1 && ['m'] ||</span> <span class='diff-add'> minutes < relativeTimeThresholds.m && ['mm', minutes] ||</span> <span class='diff-add'> hours === 1 && ['h'] ||</span> <span class='diff-add'> hours < relativeTimeThresholds.h && ['hh', hours] ||</span> <span class='diff-add'> days === 1 && ['d'] ||</span> <span class='diff-add'> days < relativeTimeThresholds.d && ['dd', days] ||</span> <span class='diff-add'> months === 1 && ['M'] ||</span> <span class='diff-add'> months < relativeTimeThresholds.M && ['MM', months] ||</span> <span class='diff-add'> years === 1 && ['y'] || ['yy', years];</span> <span class='diff-add'> args[2] = withoutSuffix;</span> <span class='diff-add'> args[3] = +posNegDuration > 0;</span> <span class='diff-add'> args[4] = locale;</span> <span class='diff-add'> return substituteTimeAgo.apply({}, args);</span> <span class='diff-add'> }</span> <span class='diff-add'> /************************************</span> <span class='diff-add'> Week of Year</span> <span class='diff-add'> ************************************/</span> <span class='diff-add'> // firstDayOfWeek 0 = sun, 6 = sat</span> <span class='diff-add'> // the day of the week that starts the week</span> <span class='diff-add'> // (usually sunday or monday)</span> <span class='diff-add'> // firstDayOfWeekOfYear 0 = sun, 6 = sat</span> <span class='diff-add'> // the first week is the week that contains the first</span> <span class='diff-add'> // of this day of the week</span> <span class='diff-add'> // (eg. ISO weeks use thursday (4))</span> <span class='diff-add'> function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {</span> <span class='diff-add'> var end = firstDayOfWeekOfYear - firstDayOfWeek,</span> <span class='diff-add'> daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),</span> <span class='diff-add'> adjustedMoment;</span> <span class='diff-add'> if (daysToDayOfWeek > end) {</span> <span class='diff-add'> daysToDayOfWeek -= 7;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (daysToDayOfWeek < end - 7) {</span> <span class='diff-add'> daysToDayOfWeek += 7;</span> <span class='diff-add'> }</span> <span class='diff-add'> adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd');</span> <span class='diff-add'> return {</span> <span class='diff-add'> week: Math.ceil(adjustedMoment.dayOfYear() / 7),</span> <span class='diff-add'> year: adjustedMoment.year()</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday</span> <span class='diff-add'> function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {</span> <span class='diff-add'> var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear;</span> <span class='diff-add'> d = d === 0 ? 7 : d;</span> <span class='diff-add'> weekday = weekday != null ? weekday : firstDayOfWeek;</span> <span class='diff-add'> daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0);</span> <span class='diff-add'> dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1;</span> <span class='diff-add'> return {</span> <span class='diff-add'> year: dayOfYear > 0 ? year : year - 1,</span> <span class='diff-add'> dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> /************************************</span> <span class='diff-add'> Top Level Functions</span> <span class='diff-add'> ************************************/</span> <span class='diff-add'> function makeMoment(config) {</span> <span class='diff-add'> var input = config._i,</span> <span class='diff-add'> format = config._f,</span> <span class='diff-add'> res;</span> <span class='diff-add'> config._locale = config._locale || moment.localeData(config._l);</span> <span class='diff-add'> if (input === null || (format === undefined && input === '')) {</span> <span class='diff-add'> return moment.invalid({nullInput: true});</span> <span class='diff-add'> }</span> <span class='diff-add'> if (typeof input === 'string') {</span> <span class='diff-add'> config._i = input = config._locale.preparse(input);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (moment.isMoment(input)) {</span> <span class='diff-add'> return new Moment(input, true);</span> <span class='diff-add'> } else if (format) {</span> <span class='diff-add'> if (isArray(format)) {</span> <span class='diff-add'> makeDateFromStringAndArray(config);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> makeDateFromStringAndFormat(config);</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> makeDateFromInput(config);</span> <span class='diff-add'> }</span> <span class='diff-add'> res = new Moment(config);</span> <span class='diff-add'> if (res._nextDay) {</span> <span class='diff-add'> // Adding is smart enough around DST</span> <span class='diff-add'> res.add(1, 'd');</span> <span class='diff-add'> res._nextDay = undefined;</span> <span class='diff-add'> }</span> <span class='diff-add'> return res;</span> <span class='diff-add'> }</span> <span class='diff-add'> moment = function (input, format, locale, strict) {</span> <span class='diff-add'> var c;</span> <span class='diff-add'> if (typeof(locale) === 'boolean') {</span> <span class='diff-add'> strict = locale;</span> <span class='diff-add'> locale = undefined;</span> <span class='diff-add'> }</span> <span class='diff-add'> // object construction must be done this way.</span> <span class='diff-add'> // https://github.com/moment/moment/issues/1423</span> <span class='diff-add'> c = {};</span> <span class='diff-add'> c._isAMomentObject = true;</span> <span class='diff-add'> c._i = input;</span> <span class='diff-add'> c._f = format;</span> <span class='diff-add'> c._l = locale;</span> <span class='diff-add'> c._strict = strict;</span> <span class='diff-add'> c._isUTC = false;</span> <span class='diff-add'> c._pf = defaultParsingFlags();</span> <span class='diff-add'> return makeMoment(c);</span> <span class='diff-add'> };</span> <span class='diff-add'> moment.suppressDeprecationWarnings = false;</span> <span class='diff-add'> moment.createFromInputFallback = deprecate(</span> <span class='diff-add'> 'moment construction falls back to js Date. This is ' +</span> <span class='diff-add'> 'discouraged and will be removed in upcoming major ' +</span> <span class='diff-add'> 'release. Please refer to ' +</span> <span class='diff-add'> 'https://github.com/moment/moment/issues/1407 for more info.',</span> <span class='diff-add'> function (config) {</span> <span class='diff-add'> config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> // Pick a moment m from moments so that m[fn](other) is true for all</span> <span class='diff-add'> // other. This relies on the function fn to be transitive.</span> <span class='diff-add'> //</span> <span class='diff-add'> // moments should either be an array of moment objects or an array, whose</span> <span class='diff-add'> // first element is an array of moment objects.</span> <span class='diff-add'> function pickBy(fn, moments) {</span> <span class='diff-add'> var res, i;</span> <span class='diff-add'> if (moments.length === 1 && isArray(moments[0])) {</span> <span class='diff-add'> moments = moments[0];</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!moments.length) {</span> <span class='diff-add'> return moment();</span> <span class='diff-add'> }</span> <span class='diff-add'> res = moments[0];</span> <span class='diff-add'> for (i = 1; i < moments.length; ++i) {</span> <span class='diff-add'> if (moments[i][fn](res)) {</span> <span class='diff-add'> res = moments[i];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return res;</span> <span class='diff-add'> }</span> <span class='diff-add'> moment.min = function () {</span> <span class='diff-add'> var args = [].slice.call(arguments, 0);</span> <span class='diff-add'> return pickBy('isBefore', args);</span> <span class='diff-add'> };</span> <span class='diff-add'> moment.max = function () {</span> <span class='diff-add'> var args = [].slice.call(arguments, 0);</span> <span class='diff-add'> return pickBy('isAfter', args);</span> <span class='diff-add'> };</span> <span class='diff-add'> // creating with utc</span> <span class='diff-add'> moment.utc = function (input, format, locale, strict) {</span> <span class='diff-add'> var c;</span> <span class='diff-add'> if (typeof(locale) === 'boolean') {</span> <span class='diff-add'> strict = locale;</span> <span class='diff-add'> locale = undefined;</span> <span class='diff-add'> }</span> <span class='diff-add'> // object construction must be done this way.</span> <span class='diff-add'> // https://github.com/moment/moment/issues/1423</span> <span class='diff-add'> c = {};</span> <span class='diff-add'> c._isAMomentObject = true;</span> <span class='diff-add'> c._useUTC = true;</span> <span class='diff-add'> c._isUTC = true;</span> <span class='diff-add'> c._l = locale;</span> <span class='diff-add'> c._i = input;</span> <span class='diff-add'> c._f = format;</span> <span class='diff-add'> c._strict = strict;</span> <span class='diff-add'> c._pf = defaultParsingFlags();</span> <span class='diff-add'> return makeMoment(c).utc();</span> <span class='diff-add'> };</span> <span class='diff-add'> // creating with unix timestamp (in seconds)</span> <span class='diff-add'> moment.unix = function (input) {</span> <span class='diff-add'> return moment(input * 1000);</span> <span class='diff-add'> };</span> <span class='diff-add'> // duration</span> <span class='diff-add'> moment.duration = function (input, key) {</span> <span class='diff-add'> var duration = input,</span> <span class='diff-add'> // matching against regexp is expensive, do it on demand</span> <span class='diff-add'> match = null,</span> <span class='diff-add'> sign,</span> <span class='diff-add'> ret,</span> <span class='diff-add'> parseIso,</span> <span class='diff-add'> diffRes;</span> <span class='diff-add'> if (moment.isDuration(input)) {</span> <span class='diff-add'> duration = {</span> <span class='diff-add'> ms: input._milliseconds,</span> <span class='diff-add'> d: input._days,</span> <span class='diff-add'> M: input._months</span> <span class='diff-add'> };</span> <span class='diff-add'> } else if (typeof input === 'number') {</span> <span class='diff-add'> duration = {};</span> <span class='diff-add'> if (key) {</span> <span class='diff-add'> duration[key] = input;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> duration.milliseconds = input;</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) {</span> <span class='diff-add'> sign = (match[1] === '-') ? -1 : 1;</span> <span class='diff-add'> duration = {</span> <span class='diff-add'> y: 0,</span> <span class='diff-add'> d: toInt(match[DATE]) * sign,</span> <span class='diff-add'> h: toInt(match[HOUR]) * sign,</span> <span class='diff-add'> m: toInt(match[MINUTE]) * sign,</span> <span class='diff-add'> s: toInt(match[SECOND]) * sign,</span> <span class='diff-add'> ms: toInt(match[MILLISECOND]) * sign</span> <span class='diff-add'> };</span> <span class='diff-add'> } else if (!!(match = isoDurationRegex.exec(input))) {</span> <span class='diff-add'> sign = (match[1] === '-') ? -1 : 1;</span> <span class='diff-add'> parseIso = function (inp) {</span> <span class='diff-add'> // We'd normally use ~~inp for this, but unfortunately it also</span> <span class='diff-add'> // converts floats to ints.</span> <span class='diff-add'> // inp may be undefined, so careful calling replace on it.</span> <span class='diff-add'> var res = inp && parseFloat(inp.replace(',', '.'));</span> <span class='diff-add'> // apply sign while we're at it</span> <span class='diff-add'> return (isNaN(res) ? 0 : res) * sign;</span> <span class='diff-add'> };</span> <span class='diff-add'> duration = {</span> <span class='diff-add'> y: parseIso(match[2]),</span> <span class='diff-add'> M: parseIso(match[3]),</span> <span class='diff-add'> d: parseIso(match[4]),</span> <span class='diff-add'> h: parseIso(match[5]),</span> <span class='diff-add'> m: parseIso(match[6]),</span> <span class='diff-add'> s: parseIso(match[7]),</span> <span class='diff-add'> w: parseIso(match[8])</span> <span class='diff-add'> };</span> <span class='diff-add'> } else if (typeof duration === 'object' &&</span> <span class='diff-add'> ('from' in duration || 'to' in duration)) {</span> <span class='diff-add'> diffRes = momentsDifference(moment(duration.from), moment(duration.to));</span> <span class='diff-add'> duration = {};</span> <span class='diff-add'> duration.ms = diffRes.milliseconds;</span> <span class='diff-add'> duration.M = diffRes.months;</span> <span class='diff-add'> }</span> <span class='diff-add'> ret = new Duration(duration);</span> <span class='diff-add'> if (moment.isDuration(input) && hasOwnProp(input, '_locale')) {</span> <span class='diff-add'> ret._locale = input._locale;</span> <span class='diff-add'> }</span> <span class='diff-add'> return ret;</span> <span class='diff-add'> };</span> <span class='diff-add'> // version number</span> <span class='diff-add'> moment.version = VERSION;</span> <span class='diff-add'> // default format</span> <span class='diff-add'> moment.defaultFormat = isoFormat;</span> <span class='diff-add'> // constant that refers to the ISO standard</span> <span class='diff-add'> moment.ISO_8601 = function () {};</span> <span class='diff-add'> // Plugins that add properties should also add the key here (null value),</span> <span class='diff-add'> // so we can properly clone ourselves.</span> <span class='diff-add'> moment.momentProperties = momentProperties;</span> <span class='diff-add'> // This function will be called whenever a moment is mutated.</span> <span class='diff-add'> // It is intended to keep the offset in sync with the timezone.</span> <span class='diff-add'> moment.updateOffset = function () {};</span> <span class='diff-add'> // This function allows you to set a threshold for relative time strings</span> <span class='diff-add'> moment.relativeTimeThreshold = function (threshold, limit) {</span> <span class='diff-add'> if (relativeTimeThresholds[threshold] === undefined) {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (limit === undefined) {</span> <span class='diff-add'> return relativeTimeThresholds[threshold];</span> <span class='diff-add'> }</span> <span class='diff-add'> relativeTimeThresholds[threshold] = limit;</span> <span class='diff-add'> return true;</span> <span class='diff-add'> };</span> <span class='diff-add'> moment.lang = deprecate(</span> <span class='diff-add'> 'moment.lang is deprecated. Use moment.locale instead.',</span> <span class='diff-add'> function (key, value) {</span> <span class='diff-add'> return moment.locale(key, value);</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> // This function will load locale and then set the global locale. If</span> <span class='diff-add'> // no arguments are passed in, it will simply return the current global</span> <span class='diff-add'> // locale key.</span> <span class='diff-add'> moment.locale = function (key, values) {</span> <span class='diff-add'> var data;</span> <span class='diff-add'> if (key) {</span> <span class='diff-add'> if (typeof(values) !== 'undefined') {</span> <span class='diff-add'> data = moment.defineLocale(key, values);</span> <span class='diff-add'> }</span> <span class='diff-add'> else {</span> <span class='diff-add'> data = moment.localeData(key);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (data) {</span> <span class='diff-add'> moment.duration._locale = moment._locale = data;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return moment._locale._abbr;</span> <span class='diff-add'> };</span> <span class='diff-add'> moment.defineLocale = function (name, values) {</span> <span class='diff-add'> if (values !== null) {</span> <span class='diff-add'> values.abbr = name;</span> <span class='diff-add'> if (!locales[name]) {</span> <span class='diff-add'> locales[name] = new Locale();</span> <span class='diff-add'> }</span> <span class='diff-add'> locales[name].set(values);</span> <span class='diff-add'> // backwards compat for now: also set the locale</span> <span class='diff-add'> moment.locale(name);</span> <span class='diff-add'> return locales[name];</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // useful for testing</span> <span class='diff-add'> delete locales[name];</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> moment.langData = deprecate(</span> <span class='diff-add'> 'moment.langData is deprecated. Use moment.localeData instead.',</span> <span class='diff-add'> function (key) {</span> <span class='diff-add'> return moment.localeData(key);</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> // returns locale data</span> <span class='diff-add'> moment.localeData = function (key) {</span> <span class='diff-add'> var locale;</span> <span class='diff-add'> if (key && key._locale && key._locale._abbr) {</span> <span class='diff-add'> key = key._locale._abbr;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!key) {</span> <span class='diff-add'> return moment._locale;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!isArray(key)) {</span> <span class='diff-add'> //short-circuit everything else</span> <span class='diff-add'> locale = loadLocale(key);</span> <span class='diff-add'> if (locale) {</span> <span class='diff-add'> return locale;</span> <span class='diff-add'> }</span> <span class='diff-add'> key = [key];</span> <span class='diff-add'> }</span> <span class='diff-add'> return chooseLocale(key);</span> <span class='diff-add'> };</span> <span class='diff-add'> // compare moment object</span> <span class='diff-add'> moment.isMoment = function (obj) {</span> <span class='diff-add'> return obj instanceof Moment ||</span> <span class='diff-add'> (obj != null && hasOwnProp(obj, '_isAMomentObject'));</span> <span class='diff-add'> };</span> <span class='diff-add'> // for typechecking Duration objects</span> <span class='diff-add'> moment.isDuration = function (obj) {</span> <span class='diff-add'> return obj instanceof Duration;</span> <span class='diff-add'> };</span> <span class='diff-add'> for (i = lists.length - 1; i >= 0; --i) {</span> <span class='diff-add'> makeList(lists[i]);</span> <span class='diff-add'> }</span> <span class='diff-add'> moment.normalizeUnits = function (units) {</span> <span class='diff-add'> return normalizeUnits(units);</span> <span class='diff-add'> };</span> <span class='diff-add'> moment.invalid = function (flags) {</span> <span class='diff-add'> var m = moment.utc(NaN);</span> <span class='diff-add'> if (flags != null) {</span> <span class='diff-add'> extend(m._pf, flags);</span> <span class='diff-add'> }</span> <span class='diff-add'> else {</span> <span class='diff-add'> m._pf.userInvalidated = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> return m;</span> <span class='diff-add'> };</span> <span class='diff-add'> moment.parseZone = function () {</span> <span class='diff-add'> return moment.apply(null, arguments).parseZone();</span> <span class='diff-add'> };</span> <span class='diff-add'> moment.parseTwoDigitYear = function (input) {</span> <span class='diff-add'> return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);</span> <span class='diff-add'> };</span> <span class='diff-add'> /************************************</span> <span class='diff-add'> Moment Prototype</span> <span class='diff-add'> ************************************/</span> <span class='diff-add'> extend(moment.fn = Moment.prototype, {</span> <span class='diff-add'> clone : function () {</span> <span class='diff-add'> return moment(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> valueOf : function () {</span> <span class='diff-add'> return +this._d + ((this._offset || 0) * 60000);</span> <span class='diff-add'> },</span> <span class='diff-add'> unix : function () {</span> <span class='diff-add'> return Math.floor(+this / 1000);</span> <span class='diff-add'> },</span> <span class='diff-add'> toString : function () {</span> <span class='diff-add'> return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');</span> <span class='diff-add'> },</span> <span class='diff-add'> toDate : function () {</span> <span class='diff-add'> return this._offset ? new Date(+this) : this._d;</span> <span class='diff-add'> },</span> <span class='diff-add'> toISOString : function () {</span> <span class='diff-add'> var m = moment(this).utc();</span> <span class='diff-add'> if (0 < m.year() && m.year() <= 9999) {</span> <span class='diff-add'> if ('function' === typeof Date.prototype.toISOString) {</span> <span class='diff-add'> // native implementation is ~50x faster, use it when we can</span> <span class='diff-add'> return this.toDate().toISOString();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> toArray : function () {</span> <span class='diff-add'> var m = this;</span> <span class='diff-add'> return [</span> <span class='diff-add'> m.year(),</span> <span class='diff-add'> m.month(),</span> <span class='diff-add'> m.date(),</span> <span class='diff-add'> m.hours(),</span> <span class='diff-add'> m.minutes(),</span> <span class='diff-add'> m.seconds(),</span> <span class='diff-add'> m.milliseconds()</span> <span class='diff-add'> ];</span> <span class='diff-add'> },</span> <span class='diff-add'> isValid : function () {</span> <span class='diff-add'> return isValid(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> isDSTShifted : function () {</span> <span class='diff-add'> if (this._a) {</span> <span class='diff-add'> return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> return false;</span> <span class='diff-add'> },</span> <span class='diff-add'> parsingFlags : function () {</span> <span class='diff-add'> return extend({}, this._pf);</span> <span class='diff-add'> },</span> <span class='diff-add'> invalidAt: function () {</span> <span class='diff-add'> return this._pf.overflow;</span> <span class='diff-add'> },</span> <span class='diff-add'> utc : function (keepLocalTime) {</span> <span class='diff-add'> return this.zone(0, keepLocalTime);</span> <span class='diff-add'> },</span> <span class='diff-add'> local : function (keepLocalTime) {</span> <span class='diff-add'> if (this._isUTC) {</span> <span class='diff-add'> this.zone(0, keepLocalTime);</span> <span class='diff-add'> this._isUTC = false;</span> <span class='diff-add'> if (keepLocalTime) {</span> <span class='diff-add'> this.add(this._dateTzOffset(), 'm');</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return this;</span> <span class='diff-add'> },</span> <span class='diff-add'> format : function (inputString) {</span> <span class='diff-add'> var output = formatMoment(this, inputString || moment.defaultFormat);</span> <span class='diff-add'> return this.localeData().postformat(output);</span> <span class='diff-add'> },</span> <span class='diff-add'> add : createAdder(1, 'add'),</span> <span class='diff-add'> subtract : createAdder(-1, 'subtract'),</span> <span class='diff-add'> diff : function (input, units, asFloat) {</span> <span class='diff-add'> var that = makeAs(input, this),</span> <span class='diff-add'> zoneDiff = (this.zone() - that.zone()) * 6e4,</span> <span class='diff-add'> diff, output, daysAdjust;</span> <span class='diff-add'> units = normalizeUnits(units);</span> <span class='diff-add'> if (units === 'year' || units === 'month') {</span> <span class='diff-add'> // average number of days in the months in the given dates</span> <span class='diff-add'> diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2</span> <span class='diff-add'> // difference in months</span> <span class='diff-add'> output = ((this.year() - that.year()) * 12) + (this.month() - that.month());</span> <span class='diff-add'> // adjust by taking difference in days, average number of days</span> <span class='diff-add'> // and dst in the given months.</span> <span class='diff-add'> daysAdjust = (this - moment(this).startOf('month')) -</span> <span class='diff-add'> (that - moment(that).startOf('month'));</span> <span class='diff-add'> // same as above but with zones, to negate all dst</span> <span class='diff-add'> daysAdjust -= ((this.zone() - moment(this).startOf('month').zone()) -</span> <span class='diff-add'> (that.zone() - moment(that).startOf('month').zone())) * 6e4;</span> <span class='diff-add'> output += daysAdjust / diff;</span> <span class='diff-add'> if (units === 'year') {</span> <span class='diff-add'> output = output / 12;</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> diff = (this - that);</span> <span class='diff-add'> output = units === 'second' ? diff / 1e3 : // 1000</span> <span class='diff-add'> units === 'minute' ? diff / 6e4 : // 1000 * 60</span> <span class='diff-add'> units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60</span> <span class='diff-add'> units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst</span> <span class='diff-add'> units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst</span> <span class='diff-add'> diff;</span> <span class='diff-add'> }</span> <span class='diff-add'> return asFloat ? output : absRound(output);</span> <span class='diff-add'> },</span> <span class='diff-add'> from : function (time, withoutSuffix) {</span> <span class='diff-add'> return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);</span> <span class='diff-add'> },</span> <span class='diff-add'> fromNow : function (withoutSuffix) {</span> <span class='diff-add'> return this.from(moment(), withoutSuffix);</span> <span class='diff-add'> },</span> <span class='diff-add'> calendar : function (time) {</span> <span class='diff-add'> // We want to compare the start of today, vs this.</span> <span class='diff-add'> // Getting start-of-today depends on whether we're zone'd or not.</span> <span class='diff-add'> var now = time || moment(),</span> <span class='diff-add'> sod = makeAs(now, this).startOf('day'),</span> <span class='diff-add'> diff = this.diff(sod, 'days', true),</span> <span class='diff-add'> format = diff < -6 ? 'sameElse' :</span> <span class='diff-add'> diff < -1 ? 'lastWeek' :</span> <span class='diff-add'> diff < 0 ? 'lastDay' :</span> <span class='diff-add'> diff < 1 ? 'sameDay' :</span> <span class='diff-add'> diff < 2 ? 'nextDay' :</span> <span class='diff-add'> diff < 7 ? 'nextWeek' : 'sameElse';</span> <span class='diff-add'> return this.format(this.localeData().calendar(format, this, moment(now)));</span> <span class='diff-add'> },</span> <span class='diff-add'> isLeapYear : function () {</span> <span class='diff-add'> return isLeapYear(this.year());</span> <span class='diff-add'> },</span> <span class='diff-add'> isDST : function () {</span> <span class='diff-add'> return (this.zone() < this.clone().month(0).zone() ||</span> <span class='diff-add'> this.zone() < this.clone().month(5).zone());</span> <span class='diff-add'> },</span> <span class='diff-add'> day : function (input) {</span> <span class='diff-add'> var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();</span> <span class='diff-add'> if (input != null) {</span> <span class='diff-add'> input = parseWeekday(input, this.localeData());</span> <span class='diff-add'> return this.add(input - day, 'd');</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return day;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> month : makeAccessor('Month', true),</span> <span class='diff-add'> startOf : function (units) {</span> <span class='diff-add'> units = normalizeUnits(units);</span> <span class='diff-add'> // the following switch intentionally omits break keywords</span> <span class='diff-add'> // to utilize falling through the cases.</span> <span class='diff-add'> switch (units) {</span> <span class='diff-add'> case 'year':</span> <span class='diff-add'> this.month(0);</span> <span class='diff-add'> /* falls through */</span> <span class='diff-add'> case 'quarter':</span> <span class='diff-add'> case 'month':</span> <span class='diff-add'> this.date(1);</span> <span class='diff-add'> /* falls through */</span> <span class='diff-add'> case 'week':</span> <span class='diff-add'> case 'isoWeek':</span> <span class='diff-add'> case 'day':</span> <span class='diff-add'> this.hours(0);</span> <span class='diff-add'> /* falls through */</span> <span class='diff-add'> case 'hour':</span> <span class='diff-add'> this.minutes(0);</span> <span class='diff-add'> /* falls through */</span> <span class='diff-add'> case 'minute':</span> <span class='diff-add'> this.seconds(0);</span> <span class='diff-add'> /* falls through */</span> <span class='diff-add'> case 'second':</span> <span class='diff-add'> this.milliseconds(0);</span> <span class='diff-add'> /* falls through */</span> <span class='diff-add'> }</span> <span class='diff-add'> // weeks are a special case</span> <span class='diff-add'> if (units === 'week') {</span> <span class='diff-add'> this.weekday(0);</span> <span class='diff-add'> } else if (units === 'isoWeek') {</span> <span class='diff-add'> this.isoWeekday(1);</span> <span class='diff-add'> }</span> <span class='diff-add'> // quarters are also special</span> <span class='diff-add'> if (units === 'quarter') {</span> <span class='diff-add'> this.month(Math.floor(this.month() / 3) * 3);</span> <span class='diff-add'> }</span> <span class='diff-add'> return this;</span> <span class='diff-add'> },</span> <span class='diff-add'> endOf: function (units) {</span> <span class='diff-add'> units = normalizeUnits(units);</span> <span class='diff-add'> if (units === undefined || units === 'millisecond') {</span> <span class='diff-add'> return this;</span> <span class='diff-add'> }</span> <span class='diff-add'> return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');</span> <span class='diff-add'> },</span> <span class='diff-add'> isAfter: function (input, units) {</span> <span class='diff-add'> var inputMs;</span> <span class='diff-add'> units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');</span> <span class='diff-add'> if (units === 'millisecond') {</span> <span class='diff-add'> input = moment.isMoment(input) ? input : moment(input);</span> <span class='diff-add'> return +this > +input;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> inputMs = moment.isMoment(input) ? +input : +moment(input);</span> <span class='diff-add'> return inputMs < +this.clone().startOf(units);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> isBefore: function (input, units) {</span> <span class='diff-add'> var inputMs;</span> <span class='diff-add'> units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');</span> <span class='diff-add'> if (units === 'millisecond') {</span> <span class='diff-add'> input = moment.isMoment(input) ? input : moment(input);</span> <span class='diff-add'> return +this < +input;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> inputMs = moment.isMoment(input) ? +input : +moment(input);</span> <span class='diff-add'> return +this.clone().endOf(units) < inputMs;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> isSame: function (input, units) {</span> <span class='diff-add'> var inputMs;</span> <span class='diff-add'> units = normalizeUnits(units || 'millisecond');</span> <span class='diff-add'> if (units === 'millisecond') {</span> <span class='diff-add'> input = moment.isMoment(input) ? input : moment(input);</span> <span class='diff-add'> return +this === +input;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> inputMs = +moment(input);</span> <span class='diff-add'> return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units));</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> min: deprecate(</span> <span class='diff-add'> 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548',</span> <span class='diff-add'> function (other) {</span> <span class='diff-add'> other = moment.apply(null, arguments);</span> <span class='diff-add'> return other < this ? this : other;</span> <span class='diff-add'> }</span> <span class='diff-add'> ),</span> <span class='diff-add'> max: deprecate(</span> <span class='diff-add'> 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548',</span> <span class='diff-add'> function (other) {</span> <span class='diff-add'> other = moment.apply(null, arguments);</span> <span class='diff-add'> return other > this ? this : other;</span> <span class='diff-add'> }</span> <span class='diff-add'> ),</span> <span class='diff-add'> // keepLocalTime = true means only change the timezone, without</span> <span class='diff-add'> // affecting the local hour. So 5:31:26 +0300 --[zone(2, true)]--></span> <span class='diff-add'> // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist int zone</span> <span class='diff-add'> // +0200, so we adjust the time as needed, to be valid.</span> <span class='diff-add'> //</span> <span class='diff-add'> // Keeping the time actually adds/subtracts (one hour)</span> <span class='diff-add'> // from the actual represented time. That is why we call updateOffset</span> <span class='diff-add'> // a second time. In case it wants us to change the offset again</span> <span class='diff-add'> // _changeInProgress == true case, then we have to adjust, because</span> <span class='diff-add'> // there is no such time in the given timezone.</span> <span class='diff-add'> zone : function (input, keepLocalTime) {</span> <span class='diff-add'> var offset = this._offset || 0,</span> <span class='diff-add'> localAdjust;</span> <span class='diff-add'> if (input != null) {</span> <span class='diff-add'> if (typeof input === 'string') {</span> <span class='diff-add'> input = timezoneMinutesFromString(input);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (Math.abs(input) < 16) {</span> <span class='diff-add'> input = input * 60;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!this._isUTC && keepLocalTime) {</span> <span class='diff-add'> localAdjust = this._dateTzOffset();</span> <span class='diff-add'> }</span> <span class='diff-add'> this._offset = input;</span> <span class='diff-add'> this._isUTC = true;</span> <span class='diff-add'> if (localAdjust != null) {</span> <span class='diff-add'> this.subtract(localAdjust, 'm');</span> <span class='diff-add'> }</span> <span class='diff-add'> if (offset !== input) {</span> <span class='diff-add'> if (!keepLocalTime || this._changeInProgress) {</span> <span class='diff-add'> addOrSubtractDurationFromMoment(this,</span> <span class='diff-add'> moment.duration(offset - input, 'm'), 1, false);</span> <span class='diff-add'> } else if (!this._changeInProgress) {</span> <span class='diff-add'> this._changeInProgress = true;</span> <span class='diff-add'> moment.updateOffset(this, true);</span> <span class='diff-add'> this._changeInProgress = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return this._isUTC ? offset : this._dateTzOffset();</span> <span class='diff-add'> }</span> <span class='diff-add'> return this;</span> <span class='diff-add'> },</span> <span class='diff-add'> zoneAbbr : function () {</span> <span class='diff-add'> return this._isUTC ? 'UTC' : '';</span> <span class='diff-add'> },</span> <span class='diff-add'> zoneName : function () {</span> <span class='diff-add'> return this._isUTC ? 'Coordinated Universal Time' : '';</span> <span class='diff-add'> },</span> <span class='diff-add'> parseZone : function () {</span> <span class='diff-add'> if (this._tzm) {</span> <span class='diff-add'> this.zone(this._tzm);</span> <span class='diff-add'> } else if (typeof this._i === 'string') {</span> <span class='diff-add'> this.zone(this._i);</span> <span class='diff-add'> }</span> <span class='diff-add'> return this;</span> <span class='diff-add'> },</span> <span class='diff-add'> hasAlignedHourOffset : function (input) {</span> <span class='diff-add'> if (!input) {</span> <span class='diff-add'> input = 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> else {</span> <span class='diff-add'> input = moment(input).zone();</span> <span class='diff-add'> }</span> <span class='diff-add'> return (this.zone() - input) % 60 === 0;</span> <span class='diff-add'> },</span> <span class='diff-add'> daysInMonth : function () {</span> <span class='diff-add'> return daysInMonth(this.year(), this.month());</span> <span class='diff-add'> },</span> <span class='diff-add'> dayOfYear : function (input) {</span> <span class='diff-add'> var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1;</span> <span class='diff-add'> return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');</span> <span class='diff-add'> },</span> <span class='diff-add'> quarter : function (input) {</span> <span class='diff-add'> return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);</span> <span class='diff-add'> },</span> <span class='diff-add'> weekYear : function (input) {</span> <span class='diff-add'> var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year;</span> <span class='diff-add'> return input == null ? year : this.add((input - year), 'y');</span> <span class='diff-add'> },</span> <span class='diff-add'> isoWeekYear : function (input) {</span> <span class='diff-add'> var year = weekOfYear(this, 1, 4).year;</span> <span class='diff-add'> return input == null ? year : this.add((input - year), 'y');</span> <span class='diff-add'> },</span> <span class='diff-add'> week : function (input) {</span> <span class='diff-add'> var week = this.localeData().week(this);</span> <span class='diff-add'> return input == null ? week : this.add((input - week) * 7, 'd');</span> <span class='diff-add'> },</span> <span class='diff-add'> isoWeek : function (input) {</span> <span class='diff-add'> var week = weekOfYear(this, 1, 4).week;</span> <span class='diff-add'> return input == null ? week : this.add((input - week) * 7, 'd');</span> <span class='diff-add'> },</span> <span class='diff-add'> weekday : function (input) {</span> <span class='diff-add'> var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;</span> <span class='diff-add'> return input == null ? weekday : this.add(input - weekday, 'd');</span> <span class='diff-add'> },</span> <span class='diff-add'> isoWeekday : function (input) {</span> <span class='diff-add'> // behaves the same as moment#day except</span> <span class='diff-add'> // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)</span> <span class='diff-add'> // as a setter, sunday should belong to the previous week.</span> <span class='diff-add'> return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);</span> <span class='diff-add'> },</span> <span class='diff-add'> isoWeeksInYear : function () {</span> <span class='diff-add'> return weeksInYear(this.year(), 1, 4);</span> <span class='diff-add'> },</span> <span class='diff-add'> weeksInYear : function () {</span> <span class='diff-add'> var weekInfo = this.localeData()._week;</span> <span class='diff-add'> return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);</span> <span class='diff-add'> },</span> <span class='diff-add'> get : function (units) {</span> <span class='diff-add'> units = normalizeUnits(units);</span> <span class='diff-add'> return this[units]();</span> <span class='diff-add'> },</span> <span class='diff-add'> set : function (units, value) {</span> <span class='diff-add'> units = normalizeUnits(units);</span> <span class='diff-add'> if (typeof this[units] === 'function') {</span> <span class='diff-add'> this[units](value);</span> <span class='diff-add'> }</span> <span class='diff-add'> return this;</span> <span class='diff-add'> },</span> <span class='diff-add'> // If passed a locale key, it will set the locale for this</span> <span class='diff-add'> // instance. Otherwise, it will return the locale configuration</span> <span class='diff-add'> // variables for this instance.</span> <span class='diff-add'> locale : function (key) {</span> <span class='diff-add'> var newLocaleData;</span> <span class='diff-add'> if (key === undefined) {</span> <span class='diff-add'> return this._locale._abbr;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> newLocaleData = moment.localeData(key);</span> <span class='diff-add'> if (newLocaleData != null) {</span> <span class='diff-add'> this._locale = newLocaleData;</span> <span class='diff-add'> }</span> <span class='diff-add'> return this;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> lang : deprecate(</span> <span class='diff-add'> 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',</span> <span class='diff-add'> function (key) {</span> <span class='diff-add'> if (key === undefined) {</span> <span class='diff-add'> return this.localeData();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return this.locale(key);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> ),</span> <span class='diff-add'> localeData : function () {</span> <span class='diff-add'> return this._locale;</span> <span class='diff-add'> },</span> <span class='diff-add'> _dateTzOffset : function () {</span> <span class='diff-add'> // On Firefox.24 Date#getTimezoneOffset returns a floating point.</span> <span class='diff-add'> // https://github.com/moment/moment/pull/1871</span> <span class='diff-add'> return Math.round(this._d.getTimezoneOffset() / 15) * 15;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> function rawMonthSetter(mom, value) {</span> <span class='diff-add'> var dayOfMonth;</span> <span class='diff-add'> // TODO: Move this out of here!</span> <span class='diff-add'> if (typeof value === 'string') {</span> <span class='diff-add'> value = mom.localeData().monthsParse(value);</span> <span class='diff-add'> // TODO: Another silent failure?</span> <span class='diff-add'> if (typeof value !== 'number') {</span> <span class='diff-add'> return mom;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> dayOfMonth = Math.min(mom.date(),</span> <span class='diff-add'> daysInMonth(mom.year(), value));</span> <span class='diff-add'> mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);</span> <span class='diff-add'> return mom;</span> <span class='diff-add'> }</span> <span class='diff-add'> function rawGetter(mom, unit) {</span> <span class='diff-add'> return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]();</span> <span class='diff-add'> }</span> <span class='diff-add'> function rawSetter(mom, unit, value) {</span> <span class='diff-add'> if (unit === 'Month') {</span> <span class='diff-add'> return rawMonthSetter(mom, value);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function makeAccessor(unit, keepTime) {</span> <span class='diff-add'> return function (value) {</span> <span class='diff-add'> if (value != null) {</span> <span class='diff-add'> rawSetter(this, unit, value);</span> <span class='diff-add'> moment.updateOffset(this, keepTime);</span> <span class='diff-add'> return this;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return rawGetter(this, unit);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false);</span> <span class='diff-add'> moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false);</span> <span class='diff-add'> moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false);</span> <span class='diff-add'> // Setting the hour should keep the time, because the user explicitly</span> <span class='diff-add'> // specified which hour he wants. So trying to maintain the same hour (in</span> <span class='diff-add'> // a new timezone) makes sense. Adding/subtracting hours does not follow</span> <span class='diff-add'> // this rule.</span> <span class='diff-add'> moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true);</span> <span class='diff-add'> // moment.fn.month is defined separately</span> <span class='diff-add'> moment.fn.date = makeAccessor('Date', true);</span> <span class='diff-add'> moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true));</span> <span class='diff-add'> moment.fn.year = makeAccessor('FullYear', true);</span> <span class='diff-add'> moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true));</span> <span class='diff-add'> // add plural methods</span> <span class='diff-add'> moment.fn.days = moment.fn.day;</span> <span class='diff-add'> moment.fn.months = moment.fn.month;</span> <span class='diff-add'> moment.fn.weeks = moment.fn.week;</span> <span class='diff-add'> moment.fn.isoWeeks = moment.fn.isoWeek;</span> <span class='diff-add'> moment.fn.quarters = moment.fn.quarter;</span> <span class='diff-add'> // add aliased format methods</span> <span class='diff-add'> moment.fn.toJSON = moment.fn.toISOString;</span> <span class='diff-add'> /************************************</span> <span class='diff-add'> Duration Prototype</span> <span class='diff-add'> ************************************/</span> <span class='diff-add'> function daysToYears (days) {</span> <span class='diff-add'> // 400 years have 146097 days (taking into account leap year rules)</span> <span class='diff-add'> return days * 400 / 146097;</span> <span class='diff-add'> }</span> <span class='diff-add'> function yearsToDays (years) {</span> <span class='diff-add'> // years * 365 + absRound(years / 4) -</span> <span class='diff-add'> // absRound(years / 100) + absRound(years / 400);</span> <span class='diff-add'> return years * 146097 / 400;</span> <span class='diff-add'> }</span> <span class='diff-add'> extend(moment.duration.fn = Duration.prototype, {</span> <span class='diff-add'> _bubble : function () {</span> <span class='diff-add'> var milliseconds = this._milliseconds,</span> <span class='diff-add'> days = this._days,</span> <span class='diff-add'> months = this._months,</span> <span class='diff-add'> data = this._data,</span> <span class='diff-add'> seconds, minutes, hours, years = 0;</span> <span class='diff-add'> // The following code bubbles up values, see the tests for</span> <span class='diff-add'> // examples of what that means.</span> <span class='diff-add'> data.milliseconds = milliseconds % 1000;</span> <span class='diff-add'> seconds = absRound(milliseconds / 1000);</span> <span class='diff-add'> data.seconds = seconds % 60;</span> <span class='diff-add'> minutes = absRound(seconds / 60);</span> <span class='diff-add'> data.minutes = minutes % 60;</span> <span class='diff-add'> hours = absRound(minutes / 60);</span> <span class='diff-add'> data.hours = hours % 24;</span> <span class='diff-add'> days += absRound(hours / 24);</span> <span class='diff-add'> // Accurately convert days to years, assume start from year 0.</span> <span class='diff-add'> years = absRound(daysToYears(days));</span> <span class='diff-add'> days -= absRound(yearsToDays(years));</span> <span class='diff-add'> // 30 days to a month</span> <span class='diff-add'> // TODO (iskren): Use anchor date (like 1st Jan) to compute this.</span> <span class='diff-add'> months += absRound(days / 30);</span> <span class='diff-add'> days %= 30;</span> <span class='diff-add'> // 12 months -> 1 year</span> <span class='diff-add'> years += absRound(months / 12);</span> <span class='diff-add'> months %= 12;</span> <span class='diff-add'> data.days = days;</span> <span class='diff-add'> data.months = months;</span> <span class='diff-add'> data.years = years;</span> <span class='diff-add'> },</span> <span class='diff-add'> abs : function () {</span> <span class='diff-add'> this._milliseconds = Math.abs(this._milliseconds);</span> <span class='diff-add'> this._days = Math.abs(this._days);</span> <span class='diff-add'> this._months = Math.abs(this._months);</span> <span class='diff-add'> this._data.milliseconds = Math.abs(this._data.milliseconds);</span> <span class='diff-add'> this._data.seconds = Math.abs(this._data.seconds);</span> <span class='diff-add'> this._data.minutes = Math.abs(this._data.minutes);</span> <span class='diff-add'> this._data.hours = Math.abs(this._data.hours);</span> <span class='diff-add'> this._data.months = Math.abs(this._data.months);</span> <span class='diff-add'> this._data.years = Math.abs(this._data.years);</span> <span class='diff-add'> return this;</span> <span class='diff-add'> },</span> <span class='diff-add'> weeks : function () {</span> <span class='diff-add'> return absRound(this.days() / 7);</span> <span class='diff-add'> },</span> <span class='diff-add'> valueOf : function () {</span> <span class='diff-add'> return this._milliseconds +</span> <span class='diff-add'> this._days * 864e5 +</span> <span class='diff-add'> (this._months % 12) * 2592e6 +</span> <span class='diff-add'> toInt(this._months / 12) * 31536e6;</span> <span class='diff-add'> },</span> <span class='diff-add'> humanize : function (withSuffix) {</span> <span class='diff-add'> var output = relativeTime(this, !withSuffix, this.localeData());</span> <span class='diff-add'> if (withSuffix) {</span> <span class='diff-add'> output = this.localeData().pastFuture(+this, output);</span> <span class='diff-add'> }</span> <span class='diff-add'> return this.localeData().postformat(output);</span> <span class='diff-add'> },</span> <span class='diff-add'> add : function (input, val) {</span> <span class='diff-add'> // supports only 2.0-style add(1, 's') or add(moment)</span> <span class='diff-add'> var dur = moment.duration(input, val);</span> <span class='diff-add'> this._milliseconds += dur._milliseconds;</span> <span class='diff-add'> this._days += dur._days;</span> <span class='diff-add'> this._months += dur._months;</span> <span class='diff-add'> this._bubble();</span> <span class='diff-add'> return this;</span> <span class='diff-add'> },</span> <span class='diff-add'> subtract : function (input, val) {</span> <span class='diff-add'> var dur = moment.duration(input, val);</span> <span class='diff-add'> this._milliseconds -= dur._milliseconds;</span> <span class='diff-add'> this._days -= dur._days;</span> <span class='diff-add'> this._months -= dur._months;</span> <span class='diff-add'> this._bubble();</span> <span class='diff-add'> return this;</span> <span class='diff-add'> },</span> <span class='diff-add'> get : function (units) {</span> <span class='diff-add'> units = normalizeUnits(units);</span> <span class='diff-add'> return this[units.toLowerCase() + 's']();</span> <span class='diff-add'> },</span> <span class='diff-add'> as : function (units) {</span> <span class='diff-add'> var days, months;</span> <span class='diff-add'> units = normalizeUnits(units);</span> <span class='diff-add'> if (units === 'month' || units === 'year') {</span> <span class='diff-add'> days = this._days + this._milliseconds / 864e5;</span> <span class='diff-add'> months = this._months + daysToYears(days) * 12;</span> <span class='diff-add'> return units === 'month' ? months : months / 12;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // handle milliseconds separately because of floating point math errors (issue #1867)</span> <span class='diff-add'> days = this._days + Math.round(yearsToDays(this._months / 12));</span> <span class='diff-add'> switch (units) {</span> <span class='diff-add'> case 'week': return days / 7 + this._milliseconds / 6048e5;</span> <span class='diff-add'> case 'day': return days + this._milliseconds / 864e5;</span> <span class='diff-add'> case 'hour': return days * 24 + this._milliseconds / 36e5;</span> <span class='diff-add'> case 'minute': return days * 24 * 60 + this._milliseconds / 6e4;</span> <span class='diff-add'> case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000;</span> <span class='diff-add'> // Math.floor prevents floating point math errors here</span> <span class='diff-add'> case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds;</span> <span class='diff-add'> default: throw new Error('Unknown unit ' + units);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> lang : moment.fn.lang,</span> <span class='diff-add'> locale : moment.fn.locale,</span> <span class='diff-add'> toIsoString : deprecate(</span> <span class='diff-add'> 'toIsoString() is deprecated. Please use toISOString() instead ' +</span> <span class='diff-add'> '(notice the capitals)',</span> <span class='diff-add'> function () {</span> <span class='diff-add'> return this.toISOString();</span> <span class='diff-add'> }</span> <span class='diff-add'> ),</span> <span class='diff-add'> toISOString : function () {</span> <span class='diff-add'> // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js</span> <span class='diff-add'> var years = Math.abs(this.years()),</span> <span class='diff-add'> months = Math.abs(this.months()),</span> <span class='diff-add'> days = Math.abs(this.days()),</span> <span class='diff-add'> hours = Math.abs(this.hours()),</span> <span class='diff-add'> minutes = Math.abs(this.minutes()),</span> <span class='diff-add'> seconds = Math.abs(this.seconds() + this.milliseconds() / 1000);</span> <span class='diff-add'> if (!this.asSeconds()) {</span> <span class='diff-add'> // this is the same as C#'s (Noda) and python (isodate)...</span> <span class='diff-add'> // but not other JS (goog.date)</span> <span class='diff-add'> return 'P0D';</span> <span class='diff-add'> }</span> <span class='diff-add'> return (this.asSeconds() < 0 ? '-' : '') +</span> <span class='diff-add'> 'P' +</span> <span class='diff-add'> (years ? years + 'Y' : '') +</span> <span class='diff-add'> (months ? months + 'M' : '') +</span> <span class='diff-add'> (days ? days + 'D' : '') +</span> <span class='diff-add'> ((hours || minutes || seconds) ? 'T' : '') +</span> <span class='diff-add'> (hours ? hours + 'H' : '') +</span> <span class='diff-add'> (minutes ? minutes + 'M' : '') +</span> <span class='diff-add'> (seconds ? seconds + 'S' : '');</span> <span class='diff-add'> },</span> <span class='diff-add'> localeData : function () {</span> <span class='diff-add'> return this._locale;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> moment.duration.fn.toString = moment.duration.fn.toISOString;</span> <span class='diff-add'> function makeDurationGetter(name) {</span> <span class='diff-add'> moment.duration.fn[name] = function () {</span> <span class='diff-add'> return this._data[name];</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> for (i in unitMillisecondFactors) {</span> <span class='diff-add'> if (hasOwnProp(unitMillisecondFactors, i)) {</span> <span class='diff-add'> makeDurationGetter(i.toLowerCase());</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> moment.duration.fn.asMilliseconds = function () {</span> <span class='diff-add'> return this.as('ms');</span> <span class='diff-add'> };</span> <span class='diff-add'> moment.duration.fn.asSeconds = function () {</span> <span class='diff-add'> return this.as('s');</span> <span class='diff-add'> };</span> <span class='diff-add'> moment.duration.fn.asMinutes = function () {</span> <span class='diff-add'> return this.as('m');</span> <span class='diff-add'> };</span> <span class='diff-add'> moment.duration.fn.asHours = function () {</span> <span class='diff-add'> return this.as('h');</span> <span class='diff-add'> };</span> <span class='diff-add'> moment.duration.fn.asDays = function () {</span> <span class='diff-add'> return this.as('d');</span> <span class='diff-add'> };</span> <span class='diff-add'> moment.duration.fn.asWeeks = function () {</span> <span class='diff-add'> return this.as('weeks');</span> <span class='diff-add'> };</span> <span class='diff-add'> moment.duration.fn.asMonths = function () {</span> <span class='diff-add'> return this.as('M');</span> <span class='diff-add'> };</span> <span class='diff-add'> moment.duration.fn.asYears = function () {</span> <span class='diff-add'> return this.as('y');</span> <span class='diff-add'> };</span> <span class='diff-add'> /************************************</span> <span class='diff-add'> Default Locale</span> <span class='diff-add'> ************************************/</span> <span class='diff-add'> // Set default locale, other locale will inherit from English.</span> <span class='diff-add'> moment.locale('en', {</span> <span class='diff-add'> ordinalParse: /\d{1,2}(th|st|nd|rd)/,</span> <span class='diff-add'> ordinal : function (number) {</span> <span class='diff-add'> var b = number % 10,</span> <span class='diff-add'> output = (toInt(number % 100 / 10) === 1) ? 'th' :</span> <span class='diff-add'> (b === 1) ? 'st' :</span> <span class='diff-add'> (b === 2) ? 'nd' :</span> <span class='diff-add'> (b === 3) ? 'rd' : 'th';</span> <span class='diff-add'> return number + output;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> /* EMBED_LOCALES */</span> <span class='diff-add'> /************************************</span> <span class='diff-add'> Exposing Moment</span> <span class='diff-add'> ************************************/</span> <span class='diff-add'> function makeGlobal(shouldDeprecate) {</span> <span class='diff-add'> /*global ender:false */</span> <span class='diff-add'> if (typeof ender !== 'undefined') {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> oldGlobalMoment = globalScope.moment;</span> <span class='diff-add'> if (shouldDeprecate) {</span> <span class='diff-add'> globalScope.moment = deprecate(</span> <span class='diff-add'> 'Accessing Moment through the global scope is ' +</span> <span class='diff-add'> 'deprecated, and will be removed in an upcoming ' +</span> <span class='diff-add'> 'release.',</span> <span class='diff-add'> moment);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> globalScope.moment = moment;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // CommonJS module is defined</span> <span class='diff-add'> if (hasModule) {</span> <span class='diff-add'> module.exports = moment;</span> <span class='diff-add'> } else if (typeof define === 'function' && define.amd) {</span> <span class='diff-add'> define('moment', function (require, exports, module) {</span> <span class='diff-add'> if (module.config && module.config() && module.config().noGlobal === true) {</span> <span class='diff-add'> // release the global variable</span> <span class='diff-add'> globalScope.moment = oldGlobalMoment;</span> <span class='diff-add'> }</span> <span class='diff-add'> return moment;</span> <span class='diff-add'> });</span> <span class='diff-add'> makeGlobal(true);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> makeGlobal();</span> <span class='diff-add'> }</span> <span class='diff-add'>}).call(this);</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/multiplex.js b/ipynb/Array-feature-overlap-05_files/multiplex.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..6a95b32</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/multiplex.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span> <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span> <span class='diff-add'>(function(mod) {</span> <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span> <span class='diff-add'> mod(require("../../lib/codemirror"));</span> <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span> <span class='diff-add'> define(["../../lib/codemirror"], mod);</span> <span class='diff-add'> else // Plain browser env</span> <span class='diff-add'> mod(CodeMirror);</span> <span class='diff-add'>})(function(CodeMirror) {</span> <span class='diff-add'>"use strict";</span> <span class='diff-add'>CodeMirror.multiplexingMode = function(outer /*, others */) {</span> <span class='diff-add'> // Others should be {open, close, mode [, delimStyle] [, innerStyle]} objects</span> <span class='diff-add'> var others = Array.prototype.slice.call(arguments, 1);</span> <span class='diff-add'> var n_others = others.length;</span> <span class='diff-add'> function indexOf(string, pattern, from) {</span> <span class='diff-add'> if (typeof pattern == "string") return string.indexOf(pattern, from);</span> <span class='diff-add'> var m = pattern.exec(from ? string.slice(from) : string);</span> <span class='diff-add'> return m ? m.index + from : -1;</span> <span class='diff-add'> }</span> <span class='diff-add'> return {</span> <span class='diff-add'> startState: function() {</span> <span class='diff-add'> return {</span> <span class='diff-add'> outer: CodeMirror.startState(outer),</span> <span class='diff-add'> innerActive: null,</span> <span class='diff-add'> inner: null</span> <span class='diff-add'> };</span> <span class='diff-add'> },</span> <span class='diff-add'> copyState: function(state) {</span> <span class='diff-add'> return {</span> <span class='diff-add'> outer: CodeMirror.copyState(outer, state.outer),</span> <span class='diff-add'> innerActive: state.innerActive,</span> <span class='diff-add'> inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner)</span> <span class='diff-add'> };</span> <span class='diff-add'> },</span> <span class='diff-add'> token: function(stream, state) {</span> <span class='diff-add'> if (!state.innerActive) {</span> <span class='diff-add'> var cutOff = Infinity, oldContent = stream.string;</span> <span class='diff-add'> for (var i = 0; i < n_others; ++i) {</span> <span class='diff-add'> var other = others[i];</span> <span class='diff-add'> var found = indexOf(oldContent, other.open, stream.pos);</span> <span class='diff-add'> if (found == stream.pos) {</span> <span class='diff-add'> stream.match(other.open);</span> <span class='diff-add'> state.innerActive = other;</span> <span class='diff-add'> state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, "") : 0);</span> <span class='diff-add'> return other.delimStyle;</span> <span class='diff-add'> } else if (found != -1 && found < cutOff) {</span> <span class='diff-add'> cutOff = found;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff);</span> <span class='diff-add'> var outerToken = outer.token(stream, state.outer);</span> <span class='diff-add'> if (cutOff != Infinity) stream.string = oldContent;</span> <span class='diff-add'> return outerToken;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var curInner = state.innerActive, oldContent = stream.string;</span> <span class='diff-add'> if (!curInner.close && stream.sol()) {</span> <span class='diff-add'> state.innerActive = state.inner = null;</span> <span class='diff-add'> return this.token(stream, state);</span> <span class='diff-add'> }</span> <span class='diff-add'> var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos) : -1;</span> <span class='diff-add'> if (found == stream.pos) {</span> <span class='diff-add'> stream.match(curInner.close);</span> <span class='diff-add'> state.innerActive = state.inner = null;</span> <span class='diff-add'> return curInner.delimStyle;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (found > -1) stream.string = oldContent.slice(0, found);</span> <span class='diff-add'> var innerToken = curInner.mode.token(stream, state.inner);</span> <span class='diff-add'> if (found > -1) stream.string = oldContent;</span> <span class='diff-add'> if (curInner.innerStyle) {</span> <span class='diff-add'> if (innerToken) innerToken = innerToken + ' ' + curInner.innerStyle;</span> <span class='diff-add'> else innerToken = curInner.innerStyle;</span> <span class='diff-add'> }</span> <span class='diff-add'> return innerToken;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> indent: function(state, textAfter) {</span> <span class='diff-add'> var mode = state.innerActive ? state.innerActive.mode : outer;</span> <span class='diff-add'> if (!mode.indent) return CodeMirror.Pass;</span> <span class='diff-add'> return mode.indent(state.innerActive ? state.inner : state.outer, textAfter);</span> <span class='diff-add'> },</span> <span class='diff-add'> blankLine: function(state) {</span> <span class='diff-add'> var mode = state.innerActive ? state.innerActive.mode : outer;</span> <span class='diff-add'> if (mode.blankLine) {</span> <span class='diff-add'> mode.blankLine(state.innerActive ? state.inner : state.outer);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!state.innerActive) {</span> <span class='diff-add'> for (var i = 0; i < n_others; ++i) {</span> <span class='diff-add'> var other = others[i];</span> <span class='diff-add'> if (other.open === "\n") {</span> <span class='diff-add'> state.innerActive = other;</span> <span class='diff-add'> state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, "") : 0);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (state.innerActive.close === "\n") {</span> <span class='diff-add'> state.innerActive = state.inner = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> electricChars: outer.electricChars,</span> <span class='diff-add'> innerMode: function(state) {</span> <span class='diff-add'> return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer};</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'>};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/namespace.js b/ipynb/Array-feature-overlap-05_files/namespace.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..c7602d2</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/namespace.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>var IPython = IPython || {};</span> <span class='diff-add'>define([], function(){</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> IPython.version = "3.0.0";</span> <span class='diff-add'> IPython._target = '_blank';</span> <span class='diff-add'> return IPython;</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/notebook.js b/ipynb/Array-feature-overlap-05_files/notebook.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..f516106</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/notebook.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>/**</span> <span class='diff-add'> * @module notebook</span> <span class='diff-add'> */</span> <span class='diff-add'>define(function (require) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var IPython = require('base/js/namespace');</span> <span class='diff-add'> var $ = require('jquery');</span> <span class='diff-add'> var utils = require('base/js/utils');</span> <span class='diff-add'> var dialog = require('base/js/dialog');</span> <span class='diff-add'> var cellmod = require('notebook/js/cell');</span> <span class='diff-add'> var textcell = require('notebook/js/textcell');</span> <span class='diff-add'> var codecell = require('notebook/js/codecell');</span> <span class='diff-add'> var moment = require('moment');</span> <span class='diff-add'> var configmod = require('services/config');</span> <span class='diff-add'> var session = require('services/sessions/session');</span> <span class='diff-add'> var celltoolbar = require('notebook/js/celltoolbar');</span> <span class='diff-add'> var marked = require('components/marked/lib/marked');</span> <span class='diff-add'> var CodeMirror = require('codemirror/lib/codemirror');</span> <span class='diff-add'> var runMode = require('codemirror/addon/runmode/runmode');</span> <span class='diff-add'> var mathjaxutils = require('notebook/js/mathjaxutils');</span> <span class='diff-add'> var keyboard = require('base/js/keyboard');</span> <span class='diff-add'> var tooltip = require('notebook/js/tooltip');</span> <span class='diff-add'> var default_celltoolbar = require('notebook/js/celltoolbarpresets/default');</span> <span class='diff-add'> var rawcell_celltoolbar = require('notebook/js/celltoolbarpresets/rawcell');</span> <span class='diff-add'> var slideshow_celltoolbar = require('notebook/js/celltoolbarpresets/slideshow');</span> <span class='diff-add'> var scrollmanager = require('notebook/js/scrollmanager');</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Contains and manages cells.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @class Notebook</span> <span class='diff-add'> * @param {string} selector</span> <span class='diff-add'> * @param {object} options - Dictionary of keyword arguments. </span> <span class='diff-add'> * @param {jQuery} options.events - selector of Events</span> <span class='diff-add'> * @param {KeyboardManager} options.keyboard_manager</span> <span class='diff-add'> * @param {Contents} options.contents</span> <span class='diff-add'> * @param {SaveWidget} options.save_widget</span> <span class='diff-add'> * @param {object} options.config</span> <span class='diff-add'> * @param {string} options.base_url</span> <span class='diff-add'> * @param {string} options.notebook_path</span> <span class='diff-add'> * @param {string} options.notebook_name</span> <span class='diff-add'> */</span> <span class='diff-add'> var Notebook = function (selector, options) {</span> <span class='diff-add'> this.config = options.config;</span> <span class='diff-add'> this.class_config = new configmod.ConfigWithDefaults(this.config, </span> <span class='diff-add'> Notebook.options_default, 'Notebook');</span> <span class='diff-add'> this.base_url = options.base_url;</span> <span class='diff-add'> this.notebook_path = options.notebook_path;</span> <span class='diff-add'> this.notebook_name = options.notebook_name;</span> <span class='diff-add'> this.events = options.events;</span> <span class='diff-add'> this.keyboard_manager = options.keyboard_manager;</span> <span class='diff-add'> this.contents = options.contents;</span> <span class='diff-add'> this.save_widget = options.save_widget;</span> <span class='diff-add'> this.tooltip = new tooltip.Tooltip(this.events);</span> <span class='diff-add'> this.ws_url = options.ws_url;</span> <span class='diff-add'> this._session_starting = false;</span> <span class='diff-add'> this.last_modified = null;</span> <span class='diff-add'> // Create default scroll manager.</span> <span class='diff-add'> this.scroll_manager = new scrollmanager.ScrollManager(this);</span> <span class='diff-add'> // TODO: This code smells (and the other `= this` line a couple lines down)</span> <span class='diff-add'> // We need a better way to deal with circular instance references.</span> <span class='diff-add'> this.keyboard_manager.notebook = this;</span> <span class='diff-add'> this.save_widget.notebook = this;</span> <span class='diff-add'> </span> <span class='diff-add'> mathjaxutils.init();</span> <span class='diff-add'> if (marked) {</span> <span class='diff-add'> marked.setOptions({</span> <span class='diff-add'> gfm : true,</span> <span class='diff-add'> tables: true,</span> <span class='diff-add'> // FIXME: probably want central config for CodeMirror theme when we have js config</span> <span class='diff-add'> langPrefix: "cm-s-ipython language-",</span> <span class='diff-add'> highlight: function(code, lang, callback) {</span> <span class='diff-add'> if (!lang) {</span> <span class='diff-add'> // no language, no highlight</span> <span class='diff-add'> if (callback) {</span> <span class='diff-add'> callback(null, code);</span> <span class='diff-add'> return;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return code;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> utils.requireCodeMirrorMode(lang, function (spec) {</span> <span class='diff-add'> var el = document.createElement("div");</span> <span class='diff-add'> var mode = CodeMirror.getMode({}, spec);</span> <span class='diff-add'> if (!mode) {</span> <span class='diff-add'> console.log("No CodeMirror mode: " + lang);</span> <span class='diff-add'> callback(null, code);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> try {</span> <span class='diff-add'> CodeMirror.runMode(code, spec, el);</span> <span class='diff-add'> callback(null, el.innerHTML);</span> <span class='diff-add'> } catch (err) {</span> <span class='diff-add'> console.log("Failed to highlight " + lang + " code", err);</span> <span class='diff-add'> callback(err, code);</span> <span class='diff-add'> }</span> <span class='diff-add'> }, function (err) {</span> <span class='diff-add'> console.log("No CodeMirror mode: " + lang);</span> <span class='diff-add'> callback(err, code);</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> this.element = $(selector);</span> <span class='diff-add'> this.element.scroll();</span> <span class='diff-add'> this.element.data("notebook", this);</span> <span class='diff-add'> this.next_prompt_number = 1;</span> <span class='diff-add'> this.session = null;</span> <span class='diff-add'> this.kernel = null;</span> <span class='diff-add'> this.clipboard = null;</span> <span class='diff-add'> this.undelete_backup = null;</span> <span class='diff-add'> this.undelete_index = null;</span> <span class='diff-add'> this.undelete_below = false;</span> <span class='diff-add'> this.paste_enabled = false;</span> <span class='diff-add'> this.writable = false;</span> <span class='diff-add'> // It is important to start out in command mode to match the intial mode</span> <span class='diff-add'> // of the KeyboardManager.</span> <span class='diff-add'> this.mode = 'command';</span> <span class='diff-add'> this.set_dirty(false);</span> <span class='diff-add'> this.metadata = {};</span> <span class='diff-add'> this._checkpoint_after_save = false;</span> <span class='diff-add'> this.last_checkpoint = null;</span> <span class='diff-add'> this.checkpoints = [];</span> <span class='diff-add'> this.autosave_interval = 0;</span> <span class='diff-add'> this.autosave_timer = null;</span> <span class='diff-add'> // autosave *at most* every two minutes</span> <span class='diff-add'> this.minimum_autosave_interval = 120000;</span> <span class='diff-add'> this.notebook_name_blacklist_re = /[\/\\:]/;</span> <span class='diff-add'> this.nbformat = 4; // Increment this when changing the nbformat</span> <span class='diff-add'> this.nbformat_minor = this.current_nbformat_minor = 0; // Increment this when changing the nbformat</span> <span class='diff-add'> this.codemirror_mode = 'ipython';</span> <span class='diff-add'> this.create_elements();</span> <span class='diff-add'> this.bind_events();</span> <span class='diff-add'> this.kernel_selector = null;</span> <span class='diff-add'> this.dirty = null;</span> <span class='diff-add'> this.trusted = null;</span> <span class='diff-add'> this._fully_loaded = false;</span> <span class='diff-add'> // Trigger cell toolbar registration.</span> <span class='diff-add'> default_celltoolbar.register(this);</span> <span class='diff-add'> rawcell_celltoolbar.register(this);</span> <span class='diff-add'> slideshow_celltoolbar.register(this);</span> <span class='diff-add'> // prevent assign to miss-typed properties.</span> <span class='diff-add'> Object.seal(this);</span> <span class='diff-add'> };</span> <span class='diff-add'> Notebook.options_default = {</span> <span class='diff-add'> // can be any cell type, or the special values of</span> <span class='diff-add'> // 'above', 'below', or 'selected' to get the value from another cell.</span> <span class='diff-add'> default_cell_type: 'code'</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Create an HTML and CSS representation of the notebook.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.create_elements = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.element.attr('tabindex','-1');</span> <span class='diff-add'> this.container = $("<div/>").addClass("container").attr("id", "notebook-container");</span> <span class='diff-add'> // We add this end_space div to the end of the notebook div to:</span> <span class='diff-add'> // i) provide a margin between the last cell and the end of the notebook</span> <span class='diff-add'> // ii) to prevent the div from scrolling up when the last cell is being</span> <span class='diff-add'> // edited, but is too low on the page, which browsers will do automatically.</span> <span class='diff-add'> var end_space = $('<div/>').addClass('end_space');</span> <span class='diff-add'> end_space.dblclick(function (e) {</span> <span class='diff-add'> var ncells = that.ncells();</span> <span class='diff-add'> that.insert_cell_below('code',ncells-1);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.element.append(this.container);</span> <span class='diff-add'> this.container.after(end_space);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Bind JavaScript events: key presses and custom IPython events.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.bind_events = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.events.on('set_next_input.Notebook', function (event, data) {</span> <span class='diff-add'> if (data.replace) {</span> <span class='diff-add'> data.cell.set_text(data.text);</span> <span class='diff-add'> data.cell.clear_output();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var index = that.find_cell_index(data.cell);</span> <span class='diff-add'> var new_cell = that.insert_cell_below('code',index);</span> <span class='diff-add'> new_cell.set_text(data.text);</span> <span class='diff-add'> }</span> <span class='diff-add'> that.dirty = true;</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('unrecognized_cell.Cell', function () {</span> <span class='diff-add'> that.warn_nbformat_minor();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('unrecognized_output.OutputArea', function () {</span> <span class='diff-add'> that.warn_nbformat_minor();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('set_dirty.Notebook', function (event, data) {</span> <span class='diff-add'> that.dirty = data.value;</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('trust_changed.Notebook', function (event, trusted) {</span> <span class='diff-add'> that.trusted = trusted;</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('select.Cell', function (event, data) {</span> <span class='diff-add'> var index = that.find_cell_index(data.cell);</span> <span class='diff-add'> that.select(index);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('edit_mode.Cell', function (event, data) {</span> <span class='diff-add'> that.handle_edit_mode(data.cell);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('command_mode.Cell', function (event, data) {</span> <span class='diff-add'> that.handle_command_mode(data.cell);</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> this.events.on('spec_changed.Kernel', function(event, data) {</span> <span class='diff-add'> that.metadata.kernelspec = {</span> <span class='diff-add'> name: data.name,</span> <span class='diff-add'> display_name: data.spec.display_name,</span> <span class='diff-add'> language: data.spec.language,</span> <span class='diff-add'> };</span> <span class='diff-add'> // start session if the current session isn't already correct</span> <span class='diff-add'> if (!(that.session && that.session.kernel && that.session.kernel.name === data.name)) {</span> <span class='diff-add'> that.start_session(data.name);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_ready.Kernel', function(event, data) {</span> <span class='diff-add'> var kinfo = data.kernel.info_reply;</span> <span class='diff-add'> if (!kinfo.language_info) {</span> <span class='diff-add'> delete that.metadata.language_info;</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var langinfo = kinfo.language_info;</span> <span class='diff-add'> that.metadata.language_info = langinfo;</span> <span class='diff-add'> // Mode 'null' should be plain, unhighlighted text.</span> <span class='diff-add'> var cm_mode = langinfo.codemirror_mode || langinfo.name || 'null';</span> <span class='diff-add'> that.set_codemirror_mode(cm_mode);</span> <span class='diff-add'> });</span> <span class='diff-add'> var collapse_time = function (time) {</span> <span class='diff-add'> var app_height = $('#ipython-main-app').height(); // content height</span> <span class='diff-add'> var splitter_height = $('div#pager_splitter').outerHeight(true);</span> <span class='diff-add'> var new_height = app_height - splitter_height;</span> <span class='diff-add'> that.element.animate({height : new_height + 'px'}, time);</span> <span class='diff-add'> };</span> <span class='diff-add'> this.element.bind('collapse_pager', function (event, extrap) {</span> <span class='diff-add'> var time = (extrap !== undefined) ? ((extrap.duration !== undefined ) ? extrap.duration : 'fast') : 'fast';</span> <span class='diff-add'> collapse_time(time);</span> <span class='diff-add'> });</span> <span class='diff-add'> var expand_time = function (time) {</span> <span class='diff-add'> var app_height = $('#ipython-main-app').height(); // content height</span> <span class='diff-add'> var splitter_height = $('div#pager_splitter').outerHeight(true);</span> <span class='diff-add'> var pager_height = $('div#pager').outerHeight(true);</span> <span class='diff-add'> var new_height = app_height - pager_height - splitter_height;</span> <span class='diff-add'> that.element.animate({height : new_height + 'px'}, time);</span> <span class='diff-add'> };</span> <span class='diff-add'> this.element.bind('expand_pager', function (event, extrap) {</span> <span class='diff-add'> var time = (extrap !== undefined) ? ((extrap.duration !== undefined ) ? extrap.duration : 'fast') : 'fast';</span> <span class='diff-add'> expand_time(time);</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> // Firefox 22 broke $(window).on("beforeunload")</span> <span class='diff-add'> // I'm not sure why or how.</span> <span class='diff-add'> window.onbeforeunload = function (e) {</span> <span class='diff-add'> // TODO: Make killing the kernel configurable.</span> <span class='diff-add'> var kill_kernel = false;</span> <span class='diff-add'> if (kill_kernel) {</span> <span class='diff-add'> that.session.delete();</span> <span class='diff-add'> }</span> <span class='diff-add'> // if we are autosaving, trigger an autosave on nav-away.</span> <span class='diff-add'> // still warn, because if we don't the autosave may fail.</span> <span class='diff-add'> if (that.dirty) {</span> <span class='diff-add'> if ( that.autosave_interval ) {</span> <span class='diff-add'> // schedule autosave in a timeout</span> <span class='diff-add'> // this gives you a chance to forcefully discard changes</span> <span class='diff-add'> // by reloading the page if you *really* want to.</span> <span class='diff-add'> // the timer doesn't start until you *dismiss* the dialog.</span> <span class='diff-add'> setTimeout(function () {</span> <span class='diff-add'> if (that.dirty) {</span> <span class='diff-add'> that.save_notebook();</span> <span class='diff-add'> }</span> <span class='diff-add'> }, 1000);</span> <span class='diff-add'> return "Autosave in progress, latest changes may be lost.";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return "Unsaved changes will be lost.";</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Null is the *only* return value that will make the browser not</span> <span class='diff-add'> // pop up the "don't leave" dialog.</span> <span class='diff-add'> return null;</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Trigger a warning dialog about missing functionality from newer minor versions</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.warn_nbformat_minor = function (event) {</span> <span class='diff-add'> var v = 'v' + this.nbformat + '.';</span> <span class='diff-add'> var orig_vs = v + this.nbformat_minor;</span> <span class='diff-add'> var this_vs = v + this.current_nbformat_minor;</span> <span class='diff-add'> var msg = "This notebook is version " + orig_vs + ", but we only fully support up to " +</span> <span class='diff-add'> this_vs + ". You can still work with this notebook, but cell and output types " +</span> <span class='diff-add'> "introduced in later notebook versions will not be available.";</span> <span class='diff-add'> dialog.modal({</span> <span class='diff-add'> notebook: this,</span> <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span> <span class='diff-add'> title : "Newer Notebook",</span> <span class='diff-add'> body : msg,</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> OK : {</span> <span class='diff-add'> "class" : "btn-danger"</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set the dirty flag, and trigger the set_dirty.Notebook event</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.set_dirty = function (value) {</span> <span class='diff-add'> if (value === undefined) {</span> <span class='diff-add'> value = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.dirty === value) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.events.trigger('set_dirty.Notebook', {value: value});</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Scroll the top of the page to a given cell.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} index - An index of the cell to view</span> <span class='diff-add'> * @param {integer} time - Animation time in milliseconds</span> <span class='diff-add'> * @return {integer} Pixel offset from the top of the container</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.scroll_to_cell = function (index, time) {</span> <span class='diff-add'> var cells = this.get_cells();</span> <span class='diff-add'> time = time || 0;</span> <span class='diff-add'> index = Math.min(cells.length-1,index);</span> <span class='diff-add'> index = Math.max(0 ,index);</span> <span class='diff-add'> var scroll_value = cells[index].element.position().top-cells[0].element.position().top ;</span> <span class='diff-add'> this.scroll_manager.element.animate({scrollTop:scroll_value}, time);</span> <span class='diff-add'> return scroll_value;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Scroll to the bottom of the page.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.scroll_to_bottom = function () {</span> <span class='diff-add'> this.scroll_manager.element.animate({scrollTop:this.element.get(0).scrollHeight}, 0);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Scroll to the top of the page.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.scroll_to_top = function () {</span> <span class='diff-add'> this.scroll_manager.element.animate({scrollTop:0}, 0);</span> <span class='diff-add'> };</span> <span class='diff-add'> // Edit Notebook metadata</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Display a dialog that allows the user to edit the Notebook's metadata.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.edit_metadata = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> dialog.edit_metadata({</span> <span class='diff-add'> md: this.metadata, </span> <span class='diff-add'> callback: function (md) {</span> <span class='diff-add'> that.metadata = md;</span> <span class='diff-add'> },</span> <span class='diff-add'> name: 'Notebook',</span> <span class='diff-add'> notebook: this,</span> <span class='diff-add'> keyboard_manager: this.keyboard_manager});</span> <span class='diff-add'> };</span> <span class='diff-add'> // Cell indexing, retrieval, etc.</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get all cell elements in the notebook.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @return {jQuery} A selector of all cell elements</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.get_cell_elements = function () {</span> <span class='diff-add'> return this.container.find(".cell").not('.cell .cell');</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get a particular cell element.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} index An index of a cell to select</span> <span class='diff-add'> * @return {jQuery} A selector of the given cell.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.get_cell_element = function (index) {</span> <span class='diff-add'> var result = null;</span> <span class='diff-add'> var e = this.get_cell_elements().eq(index);</span> <span class='diff-add'> if (e.length !== 0) {</span> <span class='diff-add'> result = e;</span> <span class='diff-add'> }</span> <span class='diff-add'> return result;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Try to get a particular cell by msg_id.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {string} msg_id A message UUID</span> <span class='diff-add'> * @return {Cell} Cell or null if no cell was found.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.get_msg_cell = function (msg_id) {</span> <span class='diff-add'> return codecell.CodeCell.msg_cells[msg_id] || null;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Count the cells in this notebook.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @return {integer} The number of cells in this notebook</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.ncells = function () {</span> <span class='diff-add'> return this.get_cell_elements().length;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get all Cell objects in this notebook.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @return {Array} This notebook's Cell objects</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.get_cells = function () {</span> <span class='diff-add'> // TODO: we are often calling cells as cells()[i], which we should optimize</span> <span class='diff-add'> // to cells(i) or a new method.</span> <span class='diff-add'> return this.get_cell_elements().toArray().map(function (e) {</span> <span class='diff-add'> return $(e).data("cell");</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get a Cell objects from this notebook.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} index - An index of a cell to retrieve</span> <span class='diff-add'> * @return {Cell} Cell or null if no cell was found.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.get_cell = function (index) {</span> <span class='diff-add'> var result = null;</span> <span class='diff-add'> var ce = this.get_cell_element(index);</span> <span class='diff-add'> if (ce !== null) {</span> <span class='diff-add'> result = ce.data('cell');</span> <span class='diff-add'> }</span> <span class='diff-add'> return result;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get the cell below a given cell.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {Cell} cell</span> <span class='diff-add'> * @return {Cell} the next cell or null if no cell was found.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.get_next_cell = function (cell) {</span> <span class='diff-add'> var result = null;</span> <span class='diff-add'> var index = this.find_cell_index(cell);</span> <span class='diff-add'> if (this.is_valid_cell_index(index+1)) {</span> <span class='diff-add'> result = this.get_cell(index+1);</span> <span class='diff-add'> }</span> <span class='diff-add'> return result;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get the cell above a given cell.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {Cell} cell</span> <span class='diff-add'> * @return {Cell} The previous cell or null if no cell was found.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.get_prev_cell = function (cell) {</span> <span class='diff-add'> var result = null;</span> <span class='diff-add'> var index = this.find_cell_index(cell);</span> <span class='diff-add'> if (index !== null && index > 0) {</span> <span class='diff-add'> result = this.get_cell(index-1);</span> <span class='diff-add'> }</span> <span class='diff-add'> return result;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get the numeric index of a given cell.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {Cell} cell</span> <span class='diff-add'> * @return {integer} The cell's numeric index or null if no cell was found.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.find_cell_index = function (cell) {</span> <span class='diff-add'> var result = null;</span> <span class='diff-add'> this.get_cell_elements().filter(function (index) {</span> <span class='diff-add'> if ($(this).data("cell") === cell) {</span> <span class='diff-add'> result = index;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> return result;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Return given index if defined, or the selected index if not.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} [index] - A cell's index</span> <span class='diff-add'> * @return {integer} cell index</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.index_or_selected = function (index) {</span> <span class='diff-add'> var i;</span> <span class='diff-add'> if (index === undefined || index === null) {</span> <span class='diff-add'> i = this.get_selected_index();</span> <span class='diff-add'> if (i === null) {</span> <span class='diff-add'> i = 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> i = index;</span> <span class='diff-add'> }</span> <span class='diff-add'> return i;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get the currently selected cell.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @return {Cell} The selected cell</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.get_selected_cell = function () {</span> <span class='diff-add'> var index = this.get_selected_index();</span> <span class='diff-add'> return this.get_cell(index);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Check whether a cell index is valid.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} index - A cell index</span> <span class='diff-add'> * @return True if the index is valid, false otherwise</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.is_valid_cell_index = function (index) {</span> <span class='diff-add'> if (index !== null && index >= 0 && index < this.ncells()) {</span> <span class='diff-add'> return true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get the index of the currently selected cell.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @return {integer} The selected cell's numeric index</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.get_selected_index = function () {</span> <span class='diff-add'> var result = null;</span> <span class='diff-add'> this.get_cell_elements().filter(function (index) {</span> <span class='diff-add'> if ($(this).data("cell").selected === true) {</span> <span class='diff-add'> result = index;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> return result;</span> <span class='diff-add'> };</span> <span class='diff-add'> // Cell selection.</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Programmatically select a cell.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} index - A cell's index</span> <span class='diff-add'> * @return {Notebook} This notebook</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.select = function (index) {</span> <span class='diff-add'> if (this.is_valid_cell_index(index)) {</span> <span class='diff-add'> var sindex = this.get_selected_index();</span> <span class='diff-add'> if (sindex !== null && index !== sindex) {</span> <span class='diff-add'> // If we are about to select a different cell, make sure we are</span> <span class='diff-add'> // first in command mode.</span> <span class='diff-add'> if (this.mode !== 'command') {</span> <span class='diff-add'> this.command_mode();</span> <span class='diff-add'> }</span> <span class='diff-add'> this.get_cell(sindex).unselect();</span> <span class='diff-add'> }</span> <span class='diff-add'> var cell = this.get_cell(index);</span> <span class='diff-add'> cell.select();</span> <span class='diff-add'> if (cell.cell_type === 'heading') {</span> <span class='diff-add'> this.events.trigger('selected_cell_type_changed.Notebook',</span> <span class='diff-add'> {'cell_type':cell.cell_type,level:cell.level}</span> <span class='diff-add'> );</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.events.trigger('selected_cell_type_changed.Notebook',</span> <span class='diff-add'> {'cell_type':cell.cell_type}</span> <span class='diff-add'> );</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return this;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Programmatically select the next cell.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @return {Notebook} This notebook</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.select_next = function () {</span> <span class='diff-add'> var index = this.get_selected_index();</span> <span class='diff-add'> this.select(index+1);</span> <span class='diff-add'> return this;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Programmatically select the previous cell.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @return {Notebook} This notebook</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.select_prev = function () {</span> <span class='diff-add'> var index = this.get_selected_index();</span> <span class='diff-add'> this.select(index-1);</span> <span class='diff-add'> return this;</span> <span class='diff-add'> };</span> <span class='diff-add'> // Edit/Command mode</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Gets the index of the cell that is in edit mode.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @return {integer} index</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.get_edit_index = function () {</span> <span class='diff-add'> var result = null;</span> <span class='diff-add'> this.get_cell_elements().filter(function (index) {</span> <span class='diff-add'> if ($(this).data("cell").mode === 'edit') {</span> <span class='diff-add'> result = index;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> return result;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle when a a cell blurs and the notebook should enter command mode.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @param {Cell} [cell] - Cell to enter command mode on.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.handle_command_mode = function (cell) {</span> <span class='diff-add'> if (this.mode !== 'command') {</span> <span class='diff-add'> cell.command_mode();</span> <span class='diff-add'> this.mode = 'command';</span> <span class='diff-add'> this.events.trigger('command_mode.Notebook');</span> <span class='diff-add'> this.keyboard_manager.command_mode();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Make the notebook enter command mode.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.command_mode = function () {</span> <span class='diff-add'> var cell = this.get_cell(this.get_edit_index());</span> <span class='diff-add'> if (cell && this.mode !== 'command') {</span> <span class='diff-add'> // We don't call cell.command_mode, but rather call cell.focus_cell()</span> <span class='diff-add'> // which will blur and CM editor and trigger the call to</span> <span class='diff-add'> // handle_command_mode.</span> <span class='diff-add'> cell.focus_cell();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle when a cell fires it's edit_mode event.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @param {Cell} [cell] Cell to enter edit mode on.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.handle_edit_mode = function (cell) {</span> <span class='diff-add'> if (cell && this.mode !== 'edit') {</span> <span class='diff-add'> cell.edit_mode();</span> <span class='diff-add'> this.mode = 'edit';</span> <span class='diff-add'> this.events.trigger('edit_mode.Notebook');</span> <span class='diff-add'> this.keyboard_manager.edit_mode();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Make a cell enter edit mode.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.edit_mode = function () {</span> <span class='diff-add'> var cell = this.get_selected_cell();</span> <span class='diff-add'> if (cell && this.mode !== 'edit') {</span> <span class='diff-add'> cell.unrender();</span> <span class='diff-add'> cell.focus_editor();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Focus the currently selected cell.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.focus_cell = function () {</span> <span class='diff-add'> var cell = this.get_selected_cell();</span> <span class='diff-add'> if (cell === null) {return;} // No cell is selected</span> <span class='diff-add'> cell.focus_cell();</span> <span class='diff-add'> };</span> <span class='diff-add'> // Cell movement</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Move given (or selected) cell up and select it.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} [index] - cell index</span> <span class='diff-add'> * @return {Notebook} This notebook</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.move_cell_up = function (index) {</span> <span class='diff-add'> var i = this.index_or_selected(index);</span> <span class='diff-add'> if (this.is_valid_cell_index(i) && i > 0) {</span> <span class='diff-add'> var pivot = this.get_cell_element(i-1);</span> <span class='diff-add'> var tomove = this.get_cell_element(i);</span> <span class='diff-add'> if (pivot !== null && tomove !== null) {</span> <span class='diff-add'> tomove.detach();</span> <span class='diff-add'> pivot.before(tomove);</span> <span class='diff-add'> this.select(i-1);</span> <span class='diff-add'> var cell = this.get_selected_cell();</span> <span class='diff-add'> cell.focus_cell();</span> <span class='diff-add'> }</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> return this;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Move given (or selected) cell down and select it.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} [index] - cell index</span> <span class='diff-add'> * @return {Notebook} This notebook</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.move_cell_down = function (index) {</span> <span class='diff-add'> var i = this.index_or_selected(index);</span> <span class='diff-add'> if (this.is_valid_cell_index(i) && this.is_valid_cell_index(i+1)) {</span> <span class='diff-add'> var pivot = this.get_cell_element(i+1);</span> <span class='diff-add'> var tomove = this.get_cell_element(i);</span> <span class='diff-add'> if (pivot !== null && tomove !== null) {</span> <span class='diff-add'> tomove.detach();</span> <span class='diff-add'> pivot.after(tomove);</span> <span class='diff-add'> this.select(i+1);</span> <span class='diff-add'> var cell = this.get_selected_cell();</span> <span class='diff-add'> cell.focus_cell();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> this.set_dirty();</span> <span class='diff-add'> return this;</span> <span class='diff-add'> };</span> <span class='diff-add'> // Insertion, deletion.</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Delete a cell from the notebook without any precautions</span> <span class='diff-add'> * Needed to reload checkpoints and other things like that.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} [index] - cell's numeric index</span> <span class='diff-add'> * @return {Notebook} This notebook</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype._unsafe_delete_cell = function (index) {</span> <span class='diff-add'> var i = this.index_or_selected(index);</span> <span class='diff-add'> var cell = this.get_cell(i);</span> <span class='diff-add'> $('#undelete_cell').addClass('disabled');</span> <span class='diff-add'> if (this.is_valid_cell_index(i)) {</span> <span class='diff-add'> var old_ncells = this.ncells();</span> <span class='diff-add'> var ce = this.get_cell_element(i);</span> <span class='diff-add'> ce.remove();</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> return this;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Delete a cell from the notebook.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} [index] - cell's numeric index</span> <span class='diff-add'> * @return {Notebook} This notebook</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.delete_cell = function (index) {</span> <span class='diff-add'> var i = this.index_or_selected(index);</span> <span class='diff-add'> var cell = this.get_cell(i);</span> <span class='diff-add'> if (!cell.is_deletable()) {</span> <span class='diff-add'> return this;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.undelete_backup = cell.toJSON();</span> <span class='diff-add'> $('#undelete_cell').removeClass('disabled');</span> <span class='diff-add'> if (this.is_valid_cell_index(i)) {</span> <span class='diff-add'> var old_ncells = this.ncells();</span> <span class='diff-add'> var ce = this.get_cell_element(i);</span> <span class='diff-add'> ce.remove();</span> <span class='diff-add'> if (i === 0) {</span> <span class='diff-add'> // Always make sure we have at least one cell.</span> <span class='diff-add'> if (old_ncells === 1) {</span> <span class='diff-add'> this.insert_cell_below('code');</span> <span class='diff-add'> }</span> <span class='diff-add'> this.select(0);</span> <span class='diff-add'> this.undelete_index = 0;</span> <span class='diff-add'> this.undelete_below = false;</span> <span class='diff-add'> } else if (i === old_ncells-1 && i !== 0) {</span> <span class='diff-add'> this.select(i-1);</span> <span class='diff-add'> this.undelete_index = i - 1;</span> <span class='diff-add'> this.undelete_below = true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.select(i);</span> <span class='diff-add'> this.undelete_index = i;</span> <span class='diff-add'> this.undelete_below = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.events.trigger('delete.Cell', {'cell': cell, 'index': i});</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> return this;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Restore the most recently deleted cell.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.undelete_cell = function() {</span> <span class='diff-add'> if (this.undelete_backup !== null && this.undelete_index !== null) {</span> <span class='diff-add'> var current_index = this.get_selected_index();</span> <span class='diff-add'> if (this.undelete_index < current_index) {</span> <span class='diff-add'> current_index = current_index + 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.undelete_index >= this.ncells()) {</span> <span class='diff-add'> this.select(this.ncells() - 1);</span> <span class='diff-add'> }</span> <span class='diff-add'> else {</span> <span class='diff-add'> this.select(this.undelete_index);</span> <span class='diff-add'> }</span> <span class='diff-add'> var cell_data = this.undelete_backup;</span> <span class='diff-add'> var new_cell = null;</span> <span class='diff-add'> if (this.undelete_below) {</span> <span class='diff-add'> new_cell = this.insert_cell_below(cell_data.cell_type);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> new_cell = this.insert_cell_above(cell_data.cell_type);</span> <span class='diff-add'> }</span> <span class='diff-add'> new_cell.fromJSON(cell_data);</span> <span class='diff-add'> if (this.undelete_below) {</span> <span class='diff-add'> this.select(current_index+1);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.select(current_index);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.undelete_backup = null;</span> <span class='diff-add'> this.undelete_index = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> $('#undelete_cell').addClass('disabled');</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Insert a cell so that after insertion the cell is at given index.</span> <span class='diff-add'> *</span> <span class='diff-add'> * If cell type is not provided, it will default to the type of the</span> <span class='diff-add'> * currently active cell.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Similar to insert_above, but index parameter is mandatory.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Index will be brought back into the accessible range [0,n].</span> <span class='diff-add'> *</span> <span class='diff-add'> * @param {string} [type] - in ['code','markdown', 'raw'], defaults to 'code'</span> <span class='diff-add'> * @param {integer} [index] - a valid index where to insert cell</span> <span class='diff-add'> * @return {Cell|null} created cell or null</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.insert_cell_at_index = function(type, index){</span> <span class='diff-add'> var ncells = this.ncells();</span> <span class='diff-add'> index = Math.min(index, ncells);</span> <span class='diff-add'> index = Math.max(index, 0);</span> <span class='diff-add'> var cell = null;</span> <span class='diff-add'> type = type || this.class_config.get_sync('default_cell_type');</span> <span class='diff-add'> if (type === 'above') {</span> <span class='diff-add'> if (index > 0) {</span> <span class='diff-add'> type = this.get_cell(index-1).cell_type;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> type = 'code';</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (type === 'below') {</span> <span class='diff-add'> if (index < ncells) {</span> <span class='diff-add'> type = this.get_cell(index).cell_type;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> type = 'code';</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (type === 'selected') {</span> <span class='diff-add'> type = this.get_selected_cell().cell_type;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (ncells === 0 || this.is_valid_cell_index(index) || index === ncells) {</span> <span class='diff-add'> var cell_options = {</span> <span class='diff-add'> events: this.events, </span> <span class='diff-add'> config: this.config, </span> <span class='diff-add'> keyboard_manager: this.keyboard_manager, </span> <span class='diff-add'> notebook: this,</span> <span class='diff-add'> tooltip: this.tooltip</span> <span class='diff-add'> };</span> <span class='diff-add'> switch(type) {</span> <span class='diff-add'> case 'code':</span> <span class='diff-add'> cell = new codecell.CodeCell(this.kernel, cell_options);</span> <span class='diff-add'> cell.set_input_prompt();</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'markdown':</span> <span class='diff-add'> cell = new textcell.MarkdownCell(cell_options);</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'raw':</span> <span class='diff-add'> cell = new textcell.RawCell(cell_options);</span> <span class='diff-add'> break;</span> <span class='diff-add'> default:</span> <span class='diff-add'> console.log("Unrecognized cell type: ", type, cellmod);</span> <span class='diff-add'> cell = new cellmod.UnrecognizedCell(cell_options);</span> <span class='diff-add'> }</span> <span class='diff-add'> if(this._insert_element_at_index(cell.element,index)) {</span> <span class='diff-add'> cell.render();</span> <span class='diff-add'> this.events.trigger('create.Cell', {'cell': cell, 'index': index});</span> <span class='diff-add'> cell.refresh();</span> <span class='diff-add'> // We used to select the cell after we refresh it, but there</span> <span class='diff-add'> // are now cases were this method is called where select is</span> <span class='diff-add'> // not appropriate. The selection logic should be handled by the</span> <span class='diff-add'> // caller of the the top level insert_cell methods.</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return cell;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Insert an element at given cell index.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @param {HTMLElement} element - a cell element</span> <span class='diff-add'> * @param {integer} [index] - a valid index where to inser cell</span> <span class='diff-add'> * @returns {boolean} success</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype._insert_element_at_index = function(element, index){</span> <span class='diff-add'> if (element === undefined){</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> var ncells = this.ncells();</span> <span class='diff-add'> if (ncells === 0) {</span> <span class='diff-add'> // special case append if empty</span> <span class='diff-add'> this.container.append(element);</span> <span class='diff-add'> } else if ( ncells === index ) {</span> <span class='diff-add'> // special case append it the end, but not empty</span> <span class='diff-add'> this.get_cell_element(index-1).after(element);</span> <span class='diff-add'> } else if (this.is_valid_cell_index(index)) {</span> <span class='diff-add'> // otherwise always somewhere to append to</span> <span class='diff-add'> this.get_cell_element(index).before(element);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.undelete_index !== null && index <= this.undelete_index) {</span> <span class='diff-add'> this.undelete_index = this.undelete_index + 1;</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> return true;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Insert a cell of given type above given index, or at top</span> <span class='diff-add'> * of notebook if index smaller than 0.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @param {string} [type] - cell type</span> <span class='diff-add'> * @param {integer} [index] - defaults to the currently selected cell</span> <span class='diff-add'> * @return {Cell|null} handle to created cell or null</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.insert_cell_above = function (type, index) {</span> <span class='diff-add'> index = this.index_or_selected(index);</span> <span class='diff-add'> return this.insert_cell_at_index(type, index);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Insert a cell of given type below given index, or at bottom</span> <span class='diff-add'> * of notebook if index greater than number of cells</span> <span class='diff-add'> *</span> <span class='diff-add'> * @param {string} [type] - cell type</span> <span class='diff-add'> * @param {integer} [index] - defaults to the currently selected cell</span> <span class='diff-add'> * @return {Cell|null} handle to created cell or null</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.insert_cell_below = function (type, index) {</span> <span class='diff-add'> index = this.index_or_selected(index);</span> <span class='diff-add'> return this.insert_cell_at_index(type, index+1);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Insert cell at end of notebook</span> <span class='diff-add'> *</span> <span class='diff-add'> * @param {string} type - cell type</span> <span class='diff-add'> * @return {Cell|null} handle to created cell or null</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.insert_cell_at_bottom = function (type){</span> <span class='diff-add'> var len = this.ncells();</span> <span class='diff-add'> return this.insert_cell_below(type,len-1);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Turn a cell into a code cell.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} [index] - cell index</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.to_code = function (index) {</span> <span class='diff-add'> var i = this.index_or_selected(index);</span> <span class='diff-add'> if (this.is_valid_cell_index(i)) {</span> <span class='diff-add'> var source_cell = this.get_cell(i);</span> <span class='diff-add'> if (!(source_cell instanceof codecell.CodeCell)) {</span> <span class='diff-add'> var target_cell = this.insert_cell_below('code',i);</span> <span class='diff-add'> var text = source_cell.get_text();</span> <span class='diff-add'> if (text === source_cell.placeholder) {</span> <span class='diff-add'> text = '';</span> <span class='diff-add'> }</span> <span class='diff-add'> //metadata</span> <span class='diff-add'> target_cell.metadata = source_cell.metadata;</span> <span class='diff-add'> target_cell.set_text(text);</span> <span class='diff-add'> // make this value the starting point, so that we can only undo</span> <span class='diff-add'> // to this state, instead of a blank cell</span> <span class='diff-add'> target_cell.code_mirror.clearHistory();</span> <span class='diff-add'> source_cell.element.remove();</span> <span class='diff-add'> this.select(i);</span> <span class='diff-add'> var cursor = source_cell.code_mirror.getCursor();</span> <span class='diff-add'> target_cell.code_mirror.setCursor(cursor);</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Turn a cell into a Markdown cell.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} [index] - cell index</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.to_markdown = function (index) {</span> <span class='diff-add'> var i = this.index_or_selected(index);</span> <span class='diff-add'> if (this.is_valid_cell_index(i)) {</span> <span class='diff-add'> var source_cell = this.get_cell(i);</span> <span class='diff-add'> if (!(source_cell instanceof textcell.MarkdownCell)) {</span> <span class='diff-add'> var target_cell = this.insert_cell_below('markdown',i);</span> <span class='diff-add'> var text = source_cell.get_text();</span> <span class='diff-add'> if (text === source_cell.placeholder) {</span> <span class='diff-add'> text = '';</span> <span class='diff-add'> }</span> <span class='diff-add'> // metadata</span> <span class='diff-add'> target_cell.metadata = source_cell.metadata;</span> <span class='diff-add'> // We must show the editor before setting its contents</span> <span class='diff-add'> target_cell.unrender();</span> <span class='diff-add'> target_cell.set_text(text);</span> <span class='diff-add'> // make this value the starting point, so that we can only undo</span> <span class='diff-add'> // to this state, instead of a blank cell</span> <span class='diff-add'> target_cell.code_mirror.clearHistory();</span> <span class='diff-add'> source_cell.element.remove();</span> <span class='diff-add'> this.select(i);</span> <span class='diff-add'> if ((source_cell instanceof textcell.TextCell) && source_cell.rendered) {</span> <span class='diff-add'> target_cell.render();</span> <span class='diff-add'> }</span> <span class='diff-add'> var cursor = source_cell.code_mirror.getCursor();</span> <span class='diff-add'> target_cell.code_mirror.setCursor(cursor);</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Turn a cell into a raw text cell.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} [index] - cell index</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.to_raw = function (index) {</span> <span class='diff-add'> var i = this.index_or_selected(index);</span> <span class='diff-add'> if (this.is_valid_cell_index(i)) {</span> <span class='diff-add'> var target_cell = null;</span> <span class='diff-add'> var source_cell = this.get_cell(i);</span> <span class='diff-add'> if (!(source_cell instanceof textcell.RawCell)) {</span> <span class='diff-add'> target_cell = this.insert_cell_below('raw',i);</span> <span class='diff-add'> var text = source_cell.get_text();</span> <span class='diff-add'> if (text === source_cell.placeholder) {</span> <span class='diff-add'> text = '';</span> <span class='diff-add'> }</span> <span class='diff-add'> //metadata</span> <span class='diff-add'> target_cell.metadata = source_cell.metadata;</span> <span class='diff-add'> // We must show the editor before setting its contents</span> <span class='diff-add'> target_cell.unrender();</span> <span class='diff-add'> target_cell.set_text(text);</span> <span class='diff-add'> // make this value the starting point, so that we can only undo</span> <span class='diff-add'> // to this state, instead of a blank cell</span> <span class='diff-add'> target_cell.code_mirror.clearHistory();</span> <span class='diff-add'> source_cell.element.remove();</span> <span class='diff-add'> this.select(i);</span> <span class='diff-add'> var cursor = source_cell.code_mirror.getCursor();</span> <span class='diff-add'> target_cell.code_mirror.setCursor(cursor);</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Warn about heading cell support removal.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype._warn_heading = function () {</span> <span class='diff-add'> dialog.modal({</span> <span class='diff-add'> notebook: this,</span> <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span> <span class='diff-add'> title : "Use markdown headings",</span> <span class='diff-add'> body : $("<p/>").text(</span> <span class='diff-add'> 'IPython no longer uses special heading cells. ' + </span> <span class='diff-add'> 'Instead, write your headings in Markdown cells using # characters:'</span> <span class='diff-add'> ).append($('<pre/>').text(</span> <span class='diff-add'> '## This is a level 2 heading'</span> <span class='diff-add'> )),</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> "OK" : {}</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Turn a cell into a heading containing markdown cell.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} [index] - cell index</span> <span class='diff-add'> * @param {integer} [level] - heading level (e.g., 1 for h1)</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.to_heading = function (index, level) {</span> <span class='diff-add'> this.to_markdown(index);</span> <span class='diff-add'> level = level || 1;</span> <span class='diff-add'> var i = this.index_or_selected(index);</span> <span class='diff-add'> if (this.is_valid_cell_index(i)) {</span> <span class='diff-add'> var cell = this.get_cell(i);</span> <span class='diff-add'> cell.set_heading_level(level);</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // Cut/Copy/Paste</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Enable the UI elements for pasting cells.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.enable_paste = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> if (!this.paste_enabled) {</span> <span class='diff-add'> $('#paste_cell_replace').removeClass('disabled')</span> <span class='diff-add'> .on('click', function () {that.paste_cell_replace();});</span> <span class='diff-add'> $('#paste_cell_above').removeClass('disabled')</span> <span class='diff-add'> .on('click', function () {that.paste_cell_above();});</span> <span class='diff-add'> $('#paste_cell_below').removeClass('disabled')</span> <span class='diff-add'> .on('click', function () {that.paste_cell_below();});</span> <span class='diff-add'> this.paste_enabled = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Disable the UI elements for pasting cells.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.disable_paste = function () {</span> <span class='diff-add'> if (this.paste_enabled) {</span> <span class='diff-add'> $('#paste_cell_replace').addClass('disabled').off('click');</span> <span class='diff-add'> $('#paste_cell_above').addClass('disabled').off('click');</span> <span class='diff-add'> $('#paste_cell_below').addClass('disabled').off('click');</span> <span class='diff-add'> this.paste_enabled = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Cut a cell.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.cut_cell = function () {</span> <span class='diff-add'> this.copy_cell();</span> <span class='diff-add'> this.delete_cell();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Copy a cell.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.copy_cell = function () {</span> <span class='diff-add'> var cell = this.get_selected_cell();</span> <span class='diff-add'> this.clipboard = cell.toJSON();</span> <span class='diff-add'> // remove undeletable status from the copied cell</span> <span class='diff-add'> if (this.clipboard.metadata.deletable !== undefined) {</span> <span class='diff-add'> delete this.clipboard.metadata.deletable;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.enable_paste();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Replace the selected cell with the cell in the clipboard.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.paste_cell_replace = function () {</span> <span class='diff-add'> if (this.clipboard !== null && this.paste_enabled) {</span> <span class='diff-add'> var cell_data = this.clipboard;</span> <span class='diff-add'> var new_cell = this.insert_cell_above(cell_data.cell_type);</span> <span class='diff-add'> new_cell.fromJSON(cell_data);</span> <span class='diff-add'> var old_cell = this.get_next_cell(new_cell);</span> <span class='diff-add'> this.delete_cell(this.find_cell_index(old_cell));</span> <span class='diff-add'> this.select(this.find_cell_index(new_cell));</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Paste a cell from the clipboard above the selected cell.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.paste_cell_above = function () {</span> <span class='diff-add'> if (this.clipboard !== null && this.paste_enabled) {</span> <span class='diff-add'> var cell_data = this.clipboard;</span> <span class='diff-add'> var new_cell = this.insert_cell_above(cell_data.cell_type);</span> <span class='diff-add'> new_cell.fromJSON(cell_data);</span> <span class='diff-add'> new_cell.focus_cell();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Paste a cell from the clipboard below the selected cell.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.paste_cell_below = function () {</span> <span class='diff-add'> if (this.clipboard !== null && this.paste_enabled) {</span> <span class='diff-add'> var cell_data = this.clipboard;</span> <span class='diff-add'> var new_cell = this.insert_cell_below(cell_data.cell_type);</span> <span class='diff-add'> new_cell.fromJSON(cell_data);</span> <span class='diff-add'> new_cell.focus_cell();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // Split/merge</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Split the selected cell into two cells.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.split_cell = function () {</span> <span class='diff-add'> var cell = this.get_selected_cell();</span> <span class='diff-add'> if (cell.is_splittable()) {</span> <span class='diff-add'> var texta = cell.get_pre_cursor();</span> <span class='diff-add'> var textb = cell.get_post_cursor();</span> <span class='diff-add'> cell.set_text(textb);</span> <span class='diff-add'> var new_cell = this.insert_cell_above(cell.cell_type);</span> <span class='diff-add'> // Unrender the new cell so we can call set_text.</span> <span class='diff-add'> new_cell.unrender();</span> <span class='diff-add'> new_cell.set_text(texta);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Merge the selected cell into the cell above it.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.merge_cell_above = function () {</span> <span class='diff-add'> var index = this.get_selected_index();</span> <span class='diff-add'> var cell = this.get_cell(index);</span> <span class='diff-add'> var render = cell.rendered;</span> <span class='diff-add'> if (!cell.is_mergeable()) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (index > 0) {</span> <span class='diff-add'> var upper_cell = this.get_cell(index-1);</span> <span class='diff-add'> if (!upper_cell.is_mergeable()) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var upper_text = upper_cell.get_text();</span> <span class='diff-add'> var text = cell.get_text();</span> <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span> <span class='diff-add'> cell.set_text(upper_text+'\n'+text);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> cell.unrender(); // Must unrender before we set_text.</span> <span class='diff-add'> cell.set_text(upper_text+'\n\n'+text);</span> <span class='diff-add'> if (render) {</span> <span class='diff-add'> // The rendered state of the final cell should match</span> <span class='diff-add'> // that of the original selected cell;</span> <span class='diff-add'> cell.render();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> this.delete_cell(index-1);</span> <span class='diff-add'> this.select(this.find_cell_index(cell));</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Merge the selected cell into the cell below it.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.merge_cell_below = function () {</span> <span class='diff-add'> var index = this.get_selected_index();</span> <span class='diff-add'> var cell = this.get_cell(index);</span> <span class='diff-add'> var render = cell.rendered;</span> <span class='diff-add'> if (!cell.is_mergeable()) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (index < this.ncells()-1) {</span> <span class='diff-add'> var lower_cell = this.get_cell(index+1);</span> <span class='diff-add'> if (!lower_cell.is_mergeable()) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var lower_text = lower_cell.get_text();</span> <span class='diff-add'> var text = cell.get_text();</span> <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span> <span class='diff-add'> cell.set_text(text+'\n'+lower_text);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> cell.unrender(); // Must unrender before we set_text.</span> <span class='diff-add'> cell.set_text(text+'\n\n'+lower_text);</span> <span class='diff-add'> if (render) {</span> <span class='diff-add'> // The rendered state of the final cell should match</span> <span class='diff-add'> // that of the original selected cell;</span> <span class='diff-add'> cell.render();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> this.delete_cell(index+1);</span> <span class='diff-add'> this.select(this.find_cell_index(cell));</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // Cell collapsing and output clearing</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Hide a cell's output.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} index - cell index</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.collapse_output = function (index) {</span> <span class='diff-add'> var i = this.index_or_selected(index);</span> <span class='diff-add'> var cell = this.get_cell(i);</span> <span class='diff-add'> if (cell !== null && (cell instanceof codecell.CodeCell)) {</span> <span class='diff-add'> cell.collapse_output();</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Hide each code cell's output area.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.collapse_all_output = function () {</span> <span class='diff-add'> this.get_cells().map(function (cell, i) {</span> <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span> <span class='diff-add'> cell.collapse_output();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> // this should not be set if the `collapse` key is removed from nbformat</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Show a cell's output.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} index - cell index</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.expand_output = function (index) {</span> <span class='diff-add'> var i = this.index_or_selected(index);</span> <span class='diff-add'> var cell = this.get_cell(i);</span> <span class='diff-add'> if (cell !== null && (cell instanceof codecell.CodeCell)) {</span> <span class='diff-add'> cell.expand_output();</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Expand each code cell's output area, and remove scrollbars.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.expand_all_output = function () {</span> <span class='diff-add'> this.get_cells().map(function (cell, i) {</span> <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span> <span class='diff-add'> cell.expand_output();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> // this should not be set if the `collapse` key is removed from nbformat</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Clear the selected CodeCell's output area.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} index - cell index</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.clear_output = function (index) {</span> <span class='diff-add'> var i = this.index_or_selected(index);</span> <span class='diff-add'> var cell = this.get_cell(i);</span> <span class='diff-add'> if (cell !== null && (cell instanceof codecell.CodeCell)) {</span> <span class='diff-add'> cell.clear_output();</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Clear each code cell's output area.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.clear_all_output = function () {</span> <span class='diff-add'> this.get_cells().map(function (cell, i) {</span> <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span> <span class='diff-add'> cell.clear_output();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Scroll the selected CodeCell's output area.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} index - cell index</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.scroll_output = function (index) {</span> <span class='diff-add'> var i = this.index_or_selected(index);</span> <span class='diff-add'> var cell = this.get_cell(i);</span> <span class='diff-add'> if (cell !== null && (cell instanceof codecell.CodeCell)) {</span> <span class='diff-add'> cell.scroll_output();</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Expand each code cell's output area and add a scrollbar for long output.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.scroll_all_output = function () {</span> <span class='diff-add'> this.get_cells().map(function (cell, i) {</span> <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span> <span class='diff-add'> cell.scroll_output();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> // this should not be set if the `collapse` key is removed from nbformat</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> };</span> <span class='diff-add'> /** </span> <span class='diff-add'> * Toggle whether a cell's output is collapsed or expanded.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} index - cell index</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.toggle_output = function (index) {</span> <span class='diff-add'> var i = this.index_or_selected(index);</span> <span class='diff-add'> var cell = this.get_cell(i);</span> <span class='diff-add'> if (cell !== null && (cell instanceof codecell.CodeCell)) {</span> <span class='diff-add'> cell.toggle_output();</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Toggle the output of all cells.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.toggle_all_output = function () {</span> <span class='diff-add'> this.get_cells().map(function (cell, i) {</span> <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span> <span class='diff-add'> cell.toggle_output();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> // this should not be set if the `collapse` key is removed from nbformat</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Toggle a scrollbar for long cell outputs.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} index - cell index</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.toggle_output_scroll = function (index) {</span> <span class='diff-add'> var i = this.index_or_selected(index);</span> <span class='diff-add'> var cell = this.get_cell(i);</span> <span class='diff-add'> if (cell !== null && (cell instanceof codecell.CodeCell)) {</span> <span class='diff-add'> cell.toggle_output_scroll();</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Toggle the scrolling of long output on all cells.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.toggle_all_output_scroll = function () {</span> <span class='diff-add'> this.get_cells().map(function (cell, i) {</span> <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span> <span class='diff-add'> cell.toggle_output_scroll();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> // this should not be set if the `collapse` key is removed from nbformat</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> };</span> <span class='diff-add'> // Other cell functions: line numbers, ...</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Toggle line numbers in the selected cell's input area.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.cell_toggle_line_numbers = function() {</span> <span class='diff-add'> this.get_selected_cell().toggle_line_numbers();</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set the codemirror mode for all code cells, including the default for</span> <span class='diff-add'> * new code cells.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.set_codemirror_mode = function(newmode){</span> <span class='diff-add'> if (newmode === this.codemirror_mode) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.codemirror_mode = newmode;</span> <span class='diff-add'> codecell.CodeCell.options_default.cm_config.mode = newmode;</span> <span class='diff-add'> </span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> utils.requireCodeMirrorMode(newmode, function (spec) {</span> <span class='diff-add'> that.get_cells().map(function(cell, i) {</span> <span class='diff-add'> if (cell.cell_type === 'code'){</span> <span class='diff-add'> cell.code_mirror.setOption('mode', spec);</span> <span class='diff-add'> // This is currently redundant, because cm_config ends up as</span> <span class='diff-add'> // codemirror's own .options object, but I don't want to</span> <span class='diff-add'> // rely on that.</span> <span class='diff-add'> cell.cm_config.mode = spec;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> // Session related things</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Start a new session and set it on each code cell.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.start_session = function (kernel_name) {</span> <span class='diff-add'> if (this._session_starting) {</span> <span class='diff-add'> throw new session.SessionAlreadyStarting();</span> <span class='diff-add'> }</span> <span class='diff-add'> this._session_starting = true;</span> <span class='diff-add'> var options = {</span> <span class='diff-add'> base_url: this.base_url,</span> <span class='diff-add'> ws_url: this.ws_url,</span> <span class='diff-add'> notebook_path: this.notebook_path,</span> <span class='diff-add'> notebook_name: this.notebook_name,</span> <span class='diff-add'> kernel_name: kernel_name,</span> <span class='diff-add'> notebook: this</span> <span class='diff-add'> };</span> <span class='diff-add'> var success = $.proxy(this._session_started, this);</span> <span class='diff-add'> var failure = $.proxy(this._session_start_failed, this);</span> <span class='diff-add'> if (this.session !== null) {</span> <span class='diff-add'> this.session.restart(options, success, failure);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.session = new session.Session(options);</span> <span class='diff-add'> this.session.start(success, failure);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Once a session is started, link the code cells to the kernel and pass the </span> <span class='diff-add'> * comm manager to the widget manager.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype._session_started = function (){</span> <span class='diff-add'> this._session_starting = false;</span> <span class='diff-add'> this.kernel = this.session.kernel;</span> <span class='diff-add'> var ncells = this.ncells();</span> <span class='diff-add'> for (var i=0; i<ncells; i++) {</span> <span class='diff-add'> var cell = this.get_cell(i);</span> <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span> <span class='diff-add'> cell.set_kernel(this.session.kernel);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when the session fails to start.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype._session_start_failed = function(jqxhr, status, error){</span> <span class='diff-add'> this._session_starting = false;</span> <span class='diff-add'> utils.log_ajax_error(jqxhr, status, error);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Prompt the user to restart the IPython kernel.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.restart_kernel = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> dialog.modal({</span> <span class='diff-add'> notebook: this,</span> <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span> <span class='diff-add'> title : "Restart kernel or continue running?",</span> <span class='diff-add'> body : $("<p/>").text(</span> <span class='diff-add'> 'Do you want to restart the current kernel? You will lose all variables defined in it.'</span> <span class='diff-add'> ),</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> "Continue running" : {},</span> <span class='diff-add'> "Restart" : {</span> <span class='diff-add'> "class" : "btn-danger",</span> <span class='diff-add'> "click" : function() {</span> <span class='diff-add'> that.kernel.restart();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Execute or render cell outputs and go into command mode.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.execute_cell = function () {</span> <span class='diff-add'> // mode = shift, ctrl, alt</span> <span class='diff-add'> var cell = this.get_selected_cell();</span> <span class='diff-add'> </span> <span class='diff-add'> cell.execute();</span> <span class='diff-add'> this.command_mode();</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Execute or render cell outputs and insert a new cell below.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.execute_cell_and_insert_below = function () {</span> <span class='diff-add'> var cell = this.get_selected_cell();</span> <span class='diff-add'> var cell_index = this.find_cell_index(cell);</span> <span class='diff-add'> </span> <span class='diff-add'> cell.execute();</span> <span class='diff-add'> // If we are at the end always insert a new cell and return</span> <span class='diff-add'> if (cell_index === (this.ncells()-1)) {</span> <span class='diff-add'> this.command_mode();</span> <span class='diff-add'> this.insert_cell_below();</span> <span class='diff-add'> this.select(cell_index+1);</span> <span class='diff-add'> this.edit_mode();</span> <span class='diff-add'> this.scroll_to_bottom();</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.command_mode();</span> <span class='diff-add'> this.insert_cell_below();</span> <span class='diff-add'> this.select(cell_index+1);</span> <span class='diff-add'> this.edit_mode();</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Execute or render cell outputs and select the next cell.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.execute_cell_and_select_below = function () {</span> <span class='diff-add'> var cell = this.get_selected_cell();</span> <span class='diff-add'> var cell_index = this.find_cell_index(cell);</span> <span class='diff-add'> </span> <span class='diff-add'> cell.execute();</span> <span class='diff-add'> // If we are at the end always insert a new cell and return</span> <span class='diff-add'> if (cell_index === (this.ncells()-1)) {</span> <span class='diff-add'> this.command_mode();</span> <span class='diff-add'> this.insert_cell_below();</span> <span class='diff-add'> this.select(cell_index+1);</span> <span class='diff-add'> this.edit_mode();</span> <span class='diff-add'> this.scroll_to_bottom();</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.command_mode();</span> <span class='diff-add'> this.select(cell_index+1);</span> <span class='diff-add'> this.focus_cell();</span> <span class='diff-add'> this.set_dirty(true);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Execute all cells below the selected cell.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.execute_cells_below = function () {</span> <span class='diff-add'> this.execute_cell_range(this.get_selected_index(), this.ncells());</span> <span class='diff-add'> this.scroll_to_bottom();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Execute all cells above the selected cell.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.execute_cells_above = function () {</span> <span class='diff-add'> this.execute_cell_range(0, this.get_selected_index());</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Execute all cells.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.execute_all_cells = function () {</span> <span class='diff-add'> this.execute_cell_range(0, this.ncells());</span> <span class='diff-add'> this.scroll_to_bottom();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Execute a contiguous range of cells.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} start - index of the first cell to execute (inclusive)</span> <span class='diff-add'> * @param {integer} end - index of the last cell to execute (exclusive)</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.execute_cell_range = function (start, end) {</span> <span class='diff-add'> this.command_mode();</span> <span class='diff-add'> for (var i=start; i<end; i++) {</span> <span class='diff-add'> this.select(i);</span> <span class='diff-add'> this.execute_cell();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // Persistance and loading</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Getter method for this notebook's name.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @return {string} This notebook's name (excluding file extension)</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.get_notebook_name = function () {</span> <span class='diff-add'> var nbname = this.notebook_name.substring(0,this.notebook_name.length-6);</span> <span class='diff-add'> return nbname;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Setter method for this notebook's name.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @param {string} name</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.set_notebook_name = function (name) {</span> <span class='diff-add'> var parent = utils.url_path_split(this.notebook_path)[0];</span> <span class='diff-add'> this.notebook_name = name;</span> <span class='diff-add'> this.notebook_path = utils.url_path_join(parent, name);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Check that a notebook's name is valid.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {string} nbname - A name for this notebook</span> <span class='diff-add'> * @return {boolean} True if the name is valid, false if invalid</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.test_notebook_name = function (nbname) {</span> <span class='diff-add'> nbname = nbname || '';</span> <span class='diff-add'> if (nbname.length>0 && !this.notebook_name_blacklist_re.test(nbname)) {</span> <span class='diff-add'> return true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Load a notebook from JSON (.ipynb).</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {object} data - JSON representation of a notebook</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.fromJSON = function (data) {</span> <span class='diff-add'> var content = data.content;</span> <span class='diff-add'> var ncells = this.ncells();</span> <span class='diff-add'> var i;</span> <span class='diff-add'> for (i=0; i<ncells; i++) {</span> <span class='diff-add'> // Always delete cell 0 as they get renumbered as they are deleted.</span> <span class='diff-add'> this._unsafe_delete_cell(0);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Save the metadata and name.</span> <span class='diff-add'> this.metadata = content.metadata;</span> <span class='diff-add'> this.notebook_name = data.name;</span> <span class='diff-add'> this.notebook_path = data.path;</span> <span class='diff-add'> var trusted = true;</span> <span class='diff-add'> </span> <span class='diff-add'> // Set the codemirror mode from language_info metadata</span> <span class='diff-add'> if (this.metadata.language_info !== undefined) {</span> <span class='diff-add'> var langinfo = this.metadata.language_info;</span> <span class='diff-add'> // Mode 'null' should be plain, unhighlighted text.</span> <span class='diff-add'> var cm_mode = langinfo.codemirror_mode || langinfo.name || 'null';</span> <span class='diff-add'> this.set_codemirror_mode(cm_mode);</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> var new_cells = content.cells;</span> <span class='diff-add'> ncells = new_cells.length;</span> <span class='diff-add'> var cell_data = null;</span> <span class='diff-add'> var new_cell = null;</span> <span class='diff-add'> for (i=0; i<ncells; i++) {</span> <span class='diff-add'> cell_data = new_cells[i];</span> <span class='diff-add'> new_cell = this.insert_cell_at_index(cell_data.cell_type, i);</span> <span class='diff-add'> new_cell.fromJSON(cell_data);</span> <span class='diff-add'> if (new_cell.cell_type === 'code' && !new_cell.output_area.trusted) {</span> <span class='diff-add'> trusted = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (trusted !== this.trusted) {</span> <span class='diff-add'> this.trusted = trusted;</span> <span class='diff-add'> this.events.trigger("trust_changed.Notebook", trusted);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Dump this notebook into a JSON-friendly object.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @return {object} A JSON-friendly representation of this notebook.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.toJSON = function () {</span> <span class='diff-add'> // remove the conversion indicator, which only belongs in-memory</span> <span class='diff-add'> delete this.metadata.orig_nbformat;</span> <span class='diff-add'> delete this.metadata.orig_nbformat_minor;</span> <span class='diff-add'> var cells = this.get_cells();</span> <span class='diff-add'> var ncells = cells.length;</span> <span class='diff-add'> var cell_array = new Array(ncells);</span> <span class='diff-add'> var trusted = true;</span> <span class='diff-add'> for (var i=0; i<ncells; i++) {</span> <span class='diff-add'> var cell = cells[i];</span> <span class='diff-add'> if (cell.cell_type === 'code' && !cell.output_area.trusted) {</span> <span class='diff-add'> trusted = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> cell_array[i] = cell.toJSON();</span> <span class='diff-add'> }</span> <span class='diff-add'> var data = {</span> <span class='diff-add'> cells: cell_array,</span> <span class='diff-add'> metadata: this.metadata,</span> <span class='diff-add'> nbformat: this.nbformat,</span> <span class='diff-add'> nbformat_minor: this.nbformat_minor</span> <span class='diff-add'> };</span> <span class='diff-add'> if (trusted !== this.trusted) {</span> <span class='diff-add'> this.trusted = trusted;</span> <span class='diff-add'> this.events.trigger("trust_changed.Notebook", trusted);</span> <span class='diff-add'> }</span> <span class='diff-add'> return data;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Start an autosave timer which periodically saves the notebook.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} interval - the autosave interval in milliseconds</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.set_autosave_interval = function (interval) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> // clear previous interval, so we don't get simultaneous timers</span> <span class='diff-add'> if (this.autosave_timer) {</span> <span class='diff-add'> clearInterval(this.autosave_timer);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!this.writable) {</span> <span class='diff-add'> // disable autosave if not writable</span> <span class='diff-add'> interval = 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> this.autosave_interval = this.minimum_autosave_interval = interval;</span> <span class='diff-add'> if (interval) {</span> <span class='diff-add'> this.autosave_timer = setInterval(function() {</span> <span class='diff-add'> if (that.dirty) {</span> <span class='diff-add'> that.save_notebook();</span> <span class='diff-add'> }</span> <span class='diff-add'> }, interval);</span> <span class='diff-add'> this.events.trigger("autosave_enabled.Notebook", interval);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.autosave_timer = null;</span> <span class='diff-add'> this.events.trigger("autosave_disabled.Notebook");</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Save this notebook on the server. This becomes a notebook instance's</span> <span class='diff-add'> * .save_notebook method *after* the entire notebook has been loaded.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.save_notebook = function (check_last_modified) {</span> <span class='diff-add'> if (check_last_modified === undefined) {</span> <span class='diff-add'> check_last_modified = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!this._fully_loaded) {</span> <span class='diff-add'> this.events.trigger('notebook_save_failed.Notebook',</span> <span class='diff-add'> new Error("Load failed, save is disabled")</span> <span class='diff-add'> );</span> <span class='diff-add'> return;</span> <span class='diff-add'> } else if (!this.writable) {</span> <span class='diff-add'> this.events.trigger('notebook_save_failed.Notebook',</span> <span class='diff-add'> new Error("Notebook is read-only")</span> <span class='diff-add'> );</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Trigger an event before save, which allows listeners to modify</span> <span class='diff-add'> // the notebook as needed.</span> <span class='diff-add'> this.events.trigger('before_save.Notebook');</span> <span class='diff-add'> // Create a JSON model to be sent to the server.</span> <span class='diff-add'> var model = {</span> <span class='diff-add'> type : "notebook",</span> <span class='diff-add'> content : this.toJSON()</span> <span class='diff-add'> };</span> <span class='diff-add'> // time the ajax call for autosave tuning purposes.</span> <span class='diff-add'> var start = new Date().getTime();</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var _save = function () {</span> <span class='diff-add'> return that.contents.save(that.notebook_path, model).then(</span> <span class='diff-add'> $.proxy(that.save_notebook_success, that, start),</span> <span class='diff-add'> function (error) {</span> <span class='diff-add'> that.events.trigger('notebook_save_failed.Notebook', error);</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> if (check_last_modified) {</span> <span class='diff-add'> return this.contents.get(this.notebook_path, {content: false}).then(</span> <span class='diff-add'> function (data) {</span> <span class='diff-add'> var last_modified = new Date(data.last_modified);</span> <span class='diff-add'> if (last_modified > that.last_modified) {</span> <span class='diff-add'> dialog.modal({</span> <span class='diff-add'> notebook: that,</span> <span class='diff-add'> keyboard_manager: that.keyboard_manager,</span> <span class='diff-add'> title: "Notebook changed",</span> <span class='diff-add'> body: "Notebook has changed since we opened it. Overwrite the changed file?",</span> <span class='diff-add'> buttons: {</span> <span class='diff-add'> Cancel: {},</span> <span class='diff-add'> Overwrite: {</span> <span class='diff-add'> class: 'btn-danger',</span> <span class='diff-add'> click: function () {</span> <span class='diff-add'> _save();</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return _save();</span> <span class='diff-add'> }</span> <span class='diff-add'> }, function (error) {</span> <span class='diff-add'> // maybe it has been deleted or renamed? Go ahead and save.</span> <span class='diff-add'> return _save();</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return _save();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Success callback for saving a notebook.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} start - Time when the save request start</span> <span class='diff-add'> * @param {object} data - JSON representation of a notebook</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.save_notebook_success = function (start, data) {</span> <span class='diff-add'> this.set_dirty(false);</span> <span class='diff-add'> this.last_modified = new Date(data.last_modified);</span> <span class='diff-add'> if (data.message) {</span> <span class='diff-add'> // save succeeded, but validation failed.</span> <span class='diff-add'> var body = $("<div>");</span> <span class='diff-add'> var title = "Notebook validation failed";</span> <span class='diff-add'> body.append($("<p>").text(</span> <span class='diff-add'> "The save operation succeeded," +</span> <span class='diff-add'> " but the notebook does not appear to be valid." +</span> <span class='diff-add'> " The validation error was:"</span> <span class='diff-add'> )).append($("<div>").addClass("validation-error").append(</span> <span class='diff-add'> $("<pre>").text(data.message)</span> <span class='diff-add'> ));</span> <span class='diff-add'> dialog.modal({</span> <span class='diff-add'> notebook: this,</span> <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span> <span class='diff-add'> title: title,</span> <span class='diff-add'> body: body,</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> OK : {</span> <span class='diff-add'> "class" : "btn-primary"</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> this.events.trigger('notebook_saved.Notebook');</span> <span class='diff-add'> this._update_autosave_interval(start);</span> <span class='diff-add'> if (this._checkpoint_after_save) {</span> <span class='diff-add'> this.create_checkpoint();</span> <span class='diff-add'> this._checkpoint_after_save = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the autosave interval based on the duration of the last save.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {integer} timestamp - when the save request started</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype._update_autosave_interval = function (start) {</span> <span class='diff-add'> var duration = (new Date().getTime() - start);</span> <span class='diff-add'> if (this.autosave_interval) {</span> <span class='diff-add'> // new save interval: higher of 10x save duration or parameter (default 30 seconds)</span> <span class='diff-add'> var interval = Math.max(10 * duration, this.minimum_autosave_interval);</span> <span class='diff-add'> // round to 10 seconds, otherwise we will be setting a new interval too often</span> <span class='diff-add'> interval = 10000 * Math.round(interval / 10000);</span> <span class='diff-add'> // set new interval, if it's changed</span> <span class='diff-add'> if (interval !== this.autosave_interval) {</span> <span class='diff-add'> this.set_autosave_interval(interval);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Explicitly trust the output of this notebook.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.trust_notebook = function () {</span> <span class='diff-add'> var body = $("<div>").append($("<p>")</span> <span class='diff-add'> .text("A trusted IPython notebook may execute hidden malicious code ")</span> <span class='diff-add'> .append($("<strong>")</span> <span class='diff-add'> .append(</span> <span class='diff-add'> $("<em>").text("when you open it")</span> <span class='diff-add'> )</span> <span class='diff-add'> ).append(".").append(</span> <span class='diff-add'> " Selecting trust will immediately reload this notebook in a trusted state."</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> " For more information, see the "</span> <span class='diff-add'> ).append($("<a>").attr("href", "http://ipython.org/ipython-doc/2/notebook/security.html")</span> <span class='diff-add'> .text("IPython security documentation")</span> <span class='diff-add'> ).append(".")</span> <span class='diff-add'> );</span> <span class='diff-add'> var nb = this;</span> <span class='diff-add'> dialog.modal({</span> <span class='diff-add'> notebook: this,</span> <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span> <span class='diff-add'> title: "Trust this notebook?",</span> <span class='diff-add'> body: body,</span> <span class='diff-add'> buttons: {</span> <span class='diff-add'> Cancel : {},</span> <span class='diff-add'> Trust : {</span> <span class='diff-add'> class : "btn-danger",</span> <span class='diff-add'> click : function () {</span> <span class='diff-add'> var cells = nb.get_cells();</span> <span class='diff-add'> for (var i = 0; i < cells.length; i++) {</span> <span class='diff-add'> var cell = cells[i];</span> <span class='diff-add'> if (cell.cell_type === 'code') {</span> <span class='diff-add'> cell.output_area.trusted = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> nb.events.on('notebook_saved.Notebook', function () {</span> <span class='diff-add'> window.location.reload();</span> <span class='diff-add'> });</span> <span class='diff-add'> nb.save_notebook();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Make a copy of the current notebook.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.copy_notebook = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var base_url = this.base_url;</span> <span class='diff-add'> var w = window.open(undefined, IPython._target);</span> <span class='diff-add'> var parent = utils.url_path_split(this.notebook_path)[0];</span> <span class='diff-add'> this.contents.copy(this.notebook_path, parent).then(</span> <span class='diff-add'> function (data) {</span> <span class='diff-add'> w.location = utils.url_join_encode(</span> <span class='diff-add'> base_url, 'notebooks', data.path</span> <span class='diff-add'> );</span> <span class='diff-add'> },</span> <span class='diff-add'> function(error) {</span> <span class='diff-add'> w.close();</span> <span class='diff-add'> that.events.trigger('notebook_copy_failed', error);</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Ensure a filename has the right extension</span> <span class='diff-add'> * Returns the filename with the appropriate extension, appending if necessary.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.ensure_extension = function (name) {</span> <span class='diff-add'> if (!name.match(/\.ipynb$/)) {</span> <span class='diff-add'> name = name + ".ipynb";</span> <span class='diff-add'> }</span> <span class='diff-add'> return name;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Rename the notebook.</span> <span class='diff-add'> * @param {string} new_name</span> <span class='diff-add'> * @return {Promise} promise that resolves when the notebook is renamed.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.rename = function (new_name) {</span> <span class='diff-add'> new_name = this.ensure_extension(new_name);</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var parent = utils.url_path_split(this.notebook_path)[0];</span> <span class='diff-add'> var new_path = utils.url_path_join(parent, new_name);</span> <span class='diff-add'> return this.contents.rename(this.notebook_path, new_path).then(</span> <span class='diff-add'> function (json) {</span> <span class='diff-add'> that.notebook_name = json.name;</span> <span class='diff-add'> that.notebook_path = json.path;</span> <span class='diff-add'> that.session.rename_notebook(json.path);</span> <span class='diff-add'> that.events.trigger('notebook_renamed.Notebook', json);</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Delete this notebook</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.delete = function () {</span> <span class='diff-add'> this.contents.delete(this.notebook_path);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Request a notebook's data from the server.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {string} notebook_path - A notebook to load</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.load_notebook = function (notebook_path) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.notebook_path = notebook_path;</span> <span class='diff-add'> this.notebook_name = utils.url_path_split(this.notebook_path)[1];</span> <span class='diff-add'> this.events.trigger('notebook_loading.Notebook');</span> <span class='diff-add'> this.contents.get(notebook_path, {type: 'notebook'}).then(</span> <span class='diff-add'> $.proxy(this.load_notebook_success, this),</span> <span class='diff-add'> $.proxy(this.load_notebook_error, this)</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Success callback for loading a notebook from the server.</span> <span class='diff-add'> * </span> <span class='diff-add'> * Load notebook data from the JSON response.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {object} data JSON representation of a notebook</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.load_notebook_success = function (data) {</span> <span class='diff-add'> var failed, msg;</span> <span class='diff-add'> try {</span> <span class='diff-add'> this.fromJSON(data);</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> failed = e;</span> <span class='diff-add'> console.log("Notebook failed to load from JSON:", e);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (failed || data.message) {</span> <span class='diff-add'> // *either* fromJSON failed or validation failed</span> <span class='diff-add'> var body = $("<div>");</span> <span class='diff-add'> var title;</span> <span class='diff-add'> if (failed) {</span> <span class='diff-add'> title = "Notebook failed to load";</span> <span class='diff-add'> body.append($("<p>").text(</span> <span class='diff-add'> "The error was: "</span> <span class='diff-add'> )).append($("<div>").addClass("js-error").text(</span> <span class='diff-add'> failed.toString()</span> <span class='diff-add'> )).append($("<p>").text(</span> <span class='diff-add'> "See the error console for details."</span> <span class='diff-add'> ));</span> <span class='diff-add'> } else {</span> <span class='diff-add'> title = "Notebook validation failed";</span> <span class='diff-add'> }</span> <span class='diff-add'> if (data.message) {</span> <span class='diff-add'> if (failed) {</span> <span class='diff-add'> msg = "The notebook also failed validation:";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> msg = "An invalid notebook may not function properly." +</span> <span class='diff-add'> " The validation error was:";</span> <span class='diff-add'> }</span> <span class='diff-add'> body.append($("<p>").text(</span> <span class='diff-add'> msg</span> <span class='diff-add'> )).append($("<div>").addClass("validation-error").append(</span> <span class='diff-add'> $("<pre>").text(data.message)</span> <span class='diff-add'> ));</span> <span class='diff-add'> }</span> <span class='diff-add'> dialog.modal({</span> <span class='diff-add'> notebook: this,</span> <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span> <span class='diff-add'> title: title,</span> <span class='diff-add'> body: body,</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> OK : {</span> <span class='diff-add'> "class" : "btn-primary"</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.ncells() === 0) {</span> <span class='diff-add'> this.insert_cell_below('code');</span> <span class='diff-add'> this.edit_mode(0);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.select(0);</span> <span class='diff-add'> this.handle_command_mode(this.get_cell(0));</span> <span class='diff-add'> }</span> <span class='diff-add'> this.set_dirty(false);</span> <span class='diff-add'> this.scroll_to_top();</span> <span class='diff-add'> this.writable = data.writable || false;</span> <span class='diff-add'> this.last_modified = new Date(data.last_modified);</span> <span class='diff-add'> var nbmodel = data.content;</span> <span class='diff-add'> var orig_nbformat = nbmodel.metadata.orig_nbformat;</span> <span class='diff-add'> var orig_nbformat_minor = nbmodel.metadata.orig_nbformat_minor;</span> <span class='diff-add'> if (orig_nbformat !== undefined && nbmodel.nbformat !== orig_nbformat) {</span> <span class='diff-add'> var src;</span> <span class='diff-add'> if (nbmodel.nbformat > orig_nbformat) {</span> <span class='diff-add'> src = " an older notebook format ";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> src = " a newer notebook format ";</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> msg = "This notebook has been converted from" + src +</span> <span class='diff-add'> "(v"+orig_nbformat+") to the current notebook " +</span> <span class='diff-add'> "format (v"+nbmodel.nbformat+"). The next time you save this notebook, the " +</span> <span class='diff-add'> "current notebook format will be used.";</span> <span class='diff-add'> </span> <span class='diff-add'> if (nbmodel.nbformat > orig_nbformat) {</span> <span class='diff-add'> msg += " Older versions of IPython may not be able to read the new format.";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> msg += " Some features of the original notebook may not be available.";</span> <span class='diff-add'> }</span> <span class='diff-add'> msg += " To preserve the original version, close the " +</span> <span class='diff-add'> "notebook without saving it.";</span> <span class='diff-add'> dialog.modal({</span> <span class='diff-add'> notebook: this,</span> <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span> <span class='diff-add'> title : "Notebook converted",</span> <span class='diff-add'> body : msg,</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> OK : {</span> <span class='diff-add'> class : "btn-primary"</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> } else if (this.nbformat_minor < nbmodel.nbformat_minor) {</span> <span class='diff-add'> this.nbformat_minor = nbmodel.nbformat_minor;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.session === null) {</span> <span class='diff-add'> var kernel_name = utils.get_url_param('kernel_name');</span> <span class='diff-add'> if (kernel_name) {</span> <span class='diff-add'> this.kernel_selector.set_kernel(kernel_name);</span> <span class='diff-add'> } else if (this.metadata.kernelspec) {</span> <span class='diff-add'> this.kernel_selector.set_kernel(this.metadata.kernelspec);</span> <span class='diff-add'> } else if (this.metadata.language) {</span> <span class='diff-add'> // compat with IJulia, IHaskell, and other early kernels</span> <span class='diff-add'> // adopters that where setting a language metadata.</span> <span class='diff-add'> this.kernel_selector.set_kernel({</span> <span class='diff-add'> name: "(No name)",</span> <span class='diff-add'> language: this.metadata.language</span> <span class='diff-add'> });</span> <span class='diff-add'> // this should be stored in kspec now, delete it.</span> <span class='diff-add'> // remove once we do not support notebook v3 anymore.</span> <span class='diff-add'> delete this.metadata.language;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // setting kernel via set_kernel above triggers start_session,</span> <span class='diff-add'> // otherwise start a new session with the server's default kernel</span> <span class='diff-add'> // spec_changed events will fire after kernel is loaded</span> <span class='diff-add'> this.start_session();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // load our checkpoint list</span> <span class='diff-add'> this.list_checkpoints();</span> <span class='diff-add'> </span> <span class='diff-add'> // load toolbar state</span> <span class='diff-add'> if (this.metadata.celltoolbar) {</span> <span class='diff-add'> celltoolbar.CellToolbar.global_show();</span> <span class='diff-add'> celltoolbar.CellToolbar.activate_preset(this.metadata.celltoolbar);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> celltoolbar.CellToolbar.global_hide();</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> if (!this.writable) {</span> <span class='diff-add'> this.set_autosave_interval(0);</span> <span class='diff-add'> this.events.trigger('notebook_read_only.Notebook');</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> // now that we're fully loaded, it is safe to restore save functionality</span> <span class='diff-add'> this._fully_loaded = true;</span> <span class='diff-add'> this.events.trigger('notebook_loaded.Notebook');</span> <span class='diff-add'> };</span> <span class='diff-add'> Notebook.prototype.set_kernelselector = function(k_selector){</span> <span class='diff-add'> this.kernel_selector = k_selector;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Failure callback for loading a notebook from the server.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {Error} error</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.load_notebook_error = function (error) {</span> <span class='diff-add'> this.events.trigger('notebook_load_failed.Notebook', error);</span> <span class='diff-add'> var msg;</span> <span class='diff-add'> if (error.name === utils.XHR_ERROR && error.xhr.status === 500) {</span> <span class='diff-add'> utils.log_ajax_error(error.xhr, error.xhr_status, error.xhr_error);</span> <span class='diff-add'> msg = "An unknown error occurred while loading this notebook. " +</span> <span class='diff-add'> "This version can load notebook formats " +</span> <span class='diff-add'> "v" + this.nbformat + " or earlier. See the server log for details.";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> msg = error.message;</span> <span class='diff-add'> console.warn('Error stack trace while loading notebook was:');</span> <span class='diff-add'> console.warn(error.stack);</span> <span class='diff-add'> }</span> <span class='diff-add'> dialog.modal({</span> <span class='diff-add'> notebook: this,</span> <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span> <span class='diff-add'> title: "Error loading notebook",</span> <span class='diff-add'> body : msg,</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> "OK": {}</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> /********************* checkpoint-related ********************/</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Save the notebook then immediately create a checkpoint.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.save_checkpoint = function () {</span> <span class='diff-add'> this._checkpoint_after_save = true;</span> <span class='diff-add'> this.save_notebook();</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Add a checkpoint for this notebook.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.add_checkpoint = function (checkpoint) {</span> <span class='diff-add'> var found = false;</span> <span class='diff-add'> for (var i = 0; i < this.checkpoints.length; i++) {</span> <span class='diff-add'> var existing = this.checkpoints[i];</span> <span class='diff-add'> if (existing.id === checkpoint.id) {</span> <span class='diff-add'> found = true;</span> <span class='diff-add'> this.checkpoints[i] = checkpoint;</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!found) {</span> <span class='diff-add'> this.checkpoints.push(checkpoint);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.last_checkpoint = this.checkpoints[this.checkpoints.length - 1];</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * List checkpoints for this notebook.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.list_checkpoints = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.contents.list_checkpoints(this.notebook_path).then(</span> <span class='diff-add'> $.proxy(this.list_checkpoints_success, this),</span> <span class='diff-add'> function(error) {</span> <span class='diff-add'> that.events.trigger('list_checkpoints_failed.Notebook', error);</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Success callback for listing checkpoints.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {object} data - JSON representation of a checkpoint</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.list_checkpoints_success = function (data) {</span> <span class='diff-add'> this.checkpoints = data;</span> <span class='diff-add'> if (data.length) {</span> <span class='diff-add'> this.last_checkpoint = data[data.length - 1];</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.last_checkpoint = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.events.trigger('checkpoints_listed.Notebook', [data]);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Create a checkpoint of this notebook on the server from the most recent save.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.create_checkpoint = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.contents.create_checkpoint(this.notebook_path).then(</span> <span class='diff-add'> $.proxy(this.create_checkpoint_success, this),</span> <span class='diff-add'> function (error) {</span> <span class='diff-add'> that.events.trigger('checkpoint_failed.Notebook', error);</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Success callback for creating a checkpoint.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {object} data - JSON representation of a checkpoint</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.create_checkpoint_success = function (data) {</span> <span class='diff-add'> this.add_checkpoint(data);</span> <span class='diff-add'> this.events.trigger('checkpoint_created.Notebook', data);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Display the restore checkpoint dialog</span> <span class='diff-add'> * @param {string} checkpoint ID</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.restore_checkpoint_dialog = function (checkpoint) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> checkpoint = checkpoint || this.last_checkpoint;</span> <span class='diff-add'> if ( ! checkpoint ) {</span> <span class='diff-add'> console.log("restore dialog, but no checkpoint to restore to!");</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var body = $('<div/>').append(</span> <span class='diff-add'> $('<p/>').addClass("p-space").text(</span> <span class='diff-add'> "Are you sure you want to revert the notebook to " +</span> <span class='diff-add'> "the latest checkpoint?"</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $("<strong/>").text(</span> <span class='diff-add'> " This cannot be undone."</span> <span class='diff-add'> )</span> <span class='diff-add'> )</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $('<p/>').addClass("p-space").text("The checkpoint was last updated at:")</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $('<p/>').addClass("p-space").text(</span> <span class='diff-add'> moment(checkpoint.last_modified).format('LLLL') +</span> <span class='diff-add'> ' ('+moment(checkpoint.last_modified).fromNow()+')'// Long form: Tuesday, January 27, 2015 12:15 PM</span> <span class='diff-add'> ).css("text-align", "center")</span> <span class='diff-add'> );</span> <span class='diff-add'> </span> <span class='diff-add'> dialog.modal({</span> <span class='diff-add'> notebook: this,</span> <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span> <span class='diff-add'> title : "Revert notebook to checkpoint",</span> <span class='diff-add'> body : body,</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> Revert : {</span> <span class='diff-add'> class : "btn-danger",</span> <span class='diff-add'> click : function () {</span> <span class='diff-add'> that.restore_checkpoint(checkpoint.id);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> Cancel : {}</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Restore the notebook to a checkpoint state.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {string} checkpoint ID</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.restore_checkpoint = function (checkpoint) {</span> <span class='diff-add'> this.events.trigger('notebook_restoring.Notebook', checkpoint);</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.contents.restore_checkpoint(this.notebook_path, checkpoint).then(</span> <span class='diff-add'> $.proxy(this.restore_checkpoint_success, this),</span> <span class='diff-add'> function (error) {</span> <span class='diff-add'> that.events.trigger('checkpoint_restore_failed.Notebook', error);</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Success callback for restoring a notebook to a checkpoint.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.restore_checkpoint_success = function () {</span> <span class='diff-add'> this.events.trigger('checkpoint_restored.Notebook');</span> <span class='diff-add'> this.load_notebook(this.notebook_path);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Delete a notebook checkpoint.</span> <span class='diff-add'> * </span> <span class='diff-add'> * @param {string} checkpoint ID</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.delete_checkpoint = function (checkpoint) {</span> <span class='diff-add'> this.events.trigger('notebook_restoring.Notebook', checkpoint);</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.contents.delete_checkpoint(this.notebook_path, checkpoint).then(</span> <span class='diff-add'> $.proxy(this.delete_checkpoint_success, this),</span> <span class='diff-add'> function (error) {</span> <span class='diff-add'> that.events.trigger('checkpoint_delete_failed.Notebook', error);</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Success callback for deleting a notebook checkpoint.</span> <span class='diff-add'> */</span> <span class='diff-add'> Notebook.prototype.delete_checkpoint_success = function () {</span> <span class='diff-add'> this.events.trigger('checkpoint_deleted.Notebook');</span> <span class='diff-add'> this.load_notebook(this.notebook_path);</span> <span class='diff-add'> };</span> <span class='diff-add'> // For backwards compatability.</span> <span class='diff-add'> IPython.Notebook = Notebook;</span> <span class='diff-add'> return {'Notebook': Notebook};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/notificationarea(1).js b/ipynb/Array-feature-overlap-05_files/notificationarea(1).js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..53607fe</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/notificationarea(1).js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/notificationwidget',</span> <span class='diff-add'>], function($, notificationwidget) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> // store reference to the NotificationWidget class</span> <span class='diff-add'> var NotificationWidget = notificationwidget.NotificationWidget;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Construct the NotificationArea object. Options are:</span> <span class='diff-add'> * events: $(Events) instance</span> <span class='diff-add'> * save_widget: SaveWidget instance</span> <span class='diff-add'> * notebook: Notebook instance</span> <span class='diff-add'> * keyboard_manager: KeyboardManager instance</span> <span class='diff-add'> *</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {string} selector - a jQuery selector string for the</span> <span class='diff-add'> * notification area element</span> <span class='diff-add'> * @param {Object} [options] - a dictionary of keyword arguments.</span> <span class='diff-add'> */</span> <span class='diff-add'> var NotificationArea = function (selector, options) {</span> <span class='diff-add'> this.selector = selector;</span> <span class='diff-add'> this.events = options.events;</span> <span class='diff-add'> if (this.selector !== undefined) {</span> <span class='diff-add'> this.element = $(selector);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.widget_dict = {};</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get a widget by name, creating it if it doesn't exist.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method widget</span> <span class='diff-add'> * @param {string} name - the widget name</span> <span class='diff-add'> */</span> <span class='diff-add'> NotificationArea.prototype.widget = function (name) {</span> <span class='diff-add'> if (this.widget_dict[name] === undefined) {</span> <span class='diff-add'> return this.new_notification_widget(name);</span> <span class='diff-add'> }</span> <span class='diff-add'> return this.get_widget(name);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get a widget by name, throwing an error if it doesn't exist.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method get_widget</span> <span class='diff-add'> * @param {string} name - the widget name</span> <span class='diff-add'> */</span> <span class='diff-add'> NotificationArea.prototype.get_widget = function (name) {</span> <span class='diff-add'> if(this.widget_dict[name] === undefined) {</span> <span class='diff-add'> throw('no widgets with this name');</span> <span class='diff-add'> }</span> <span class='diff-add'> return this.widget_dict[name];</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Create a new notification widget with the given name. The</span> <span class='diff-add'> * widget must not already exist.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method new_notification_widget</span> <span class='diff-add'> * @param {string} name - the widget name</span> <span class='diff-add'> */</span> <span class='diff-add'> NotificationArea.prototype.new_notification_widget = function (name) {</span> <span class='diff-add'> if (this.widget_dict[name] !== undefined) {</span> <span class='diff-add'> throw('widget with that name already exists!');</span> <span class='diff-add'> }</span> <span class='diff-add'> // create the element for the notification widget and add it</span> <span class='diff-add'> // to the notification aread element</span> <span class='diff-add'> var div = $('<div/>').attr('id', 'notification_' + name);</span> <span class='diff-add'> $(this.selector).append(div);</span> <span class='diff-add'> // create the widget object and return it</span> <span class='diff-add'> this.widget_dict[name] = new NotificationWidget('#notification_' + name);</span> <span class='diff-add'> return this.widget_dict[name];</span> <span class='diff-add'> };</span> <span class='diff-add'> return {'NotificationArea': NotificationArea};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/notificationarea.js b/ipynb/Array-feature-overlap-05_files/notificationarea.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..a083bf1</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/notificationarea.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> 'base/js/dialog',</span> <span class='diff-add'> 'base/js/notificationarea',</span> <span class='diff-add'> 'moment'</span> <span class='diff-add'>], function(IPython, $, utils, dialog, notificationarea, moment) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var NotificationArea = notificationarea.NotificationArea;</span> <span class='diff-add'> </span> <span class='diff-add'> var NotebookNotificationArea = function(selector, options) {</span> <span class='diff-add'> NotificationArea.apply(this, [selector, options]);</span> <span class='diff-add'> this.save_widget = options.save_widget;</span> <span class='diff-add'> this.notebook = options.notebook;</span> <span class='diff-add'> this.keyboard_manager = options.keyboard_manager;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> NotebookNotificationArea.prototype = Object.create(NotificationArea.prototype);</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Initialize the default set of notification widgets.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method init_notification_widgets</span> <span class='diff-add'> */</span> <span class='diff-add'> NotebookNotificationArea.prototype.init_notification_widgets = function () {</span> <span class='diff-add'> this.init_kernel_notification_widget();</span> <span class='diff-add'> this.init_notebook_notification_widget();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Initialize the notification widget for kernel status messages.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method init_kernel_notification_widget</span> <span class='diff-add'> */</span> <span class='diff-add'> NotebookNotificationArea.prototype.init_kernel_notification_widget = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var knw = this.new_notification_widget('kernel');</span> <span class='diff-add'> var $kernel_ind_icon = $("#kernel_indicator_icon");</span> <span class='diff-add'> var $modal_ind_icon = $("#modal_indicator");</span> <span class='diff-add'> var $readonly_ind_icon = $('#readonly-indicator');</span> <span class='diff-add'> var $body = $('body');</span> <span class='diff-add'> // Listen for the notebook loaded event. Set readonly indicator.</span> <span class='diff-add'> this.events.on('notebook_loaded.Notebook', function() {</span> <span class='diff-add'> if (that.notebook.writable) {</span> <span class='diff-add'> $readonly_ind_icon.hide();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> $readonly_ind_icon.show();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> // Command/Edit mode</span> <span class='diff-add'> this.events.on('edit_mode.Notebook', function () {</span> <span class='diff-add'> that.save_widget.update_document_title();</span> <span class='diff-add'> $body.addClass('edit_mode');</span> <span class='diff-add'> $body.removeClass('command_mode');</span> <span class='diff-add'> $modal_ind_icon.attr('title','Edit Mode');</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('command_mode.Notebook', function () {</span> <span class='diff-add'> that.save_widget.update_document_title();</span> <span class='diff-add'> $body.removeClass('edit_mode');</span> <span class='diff-add'> $body.addClass('command_mode');</span> <span class='diff-add'> $modal_ind_icon.attr('title','Command Mode');</span> <span class='diff-add'> });</span> <span class='diff-add'> // Implicitly start off in Command mode, switching to Edit mode will trigger event</span> <span class='diff-add'> $modal_ind_icon.addClass('modal_indicator').attr('title','Command Mode');</span> <span class='diff-add'> $body.addClass('command_mode');</span> <span class='diff-add'> // Kernel events</span> <span class='diff-add'> // this can be either kernel_created.Kernel or kernel_created.Session</span> <span class='diff-add'> this.events.on('kernel_created.Kernel kernel_created.Session', function () {</span> <span class='diff-add'> knw.info("Kernel Created", 500);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_reconnecting.Kernel', function () {</span> <span class='diff-add'> knw.warning("Connecting to kernel");</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_connection_dead.Kernel', function (evt, info) {</span> <span class='diff-add'> knw.danger("Not Connected", undefined, function () {</span> <span class='diff-add'> // schedule reconnect a short time in the future, don't reconnect immediately</span> <span class='diff-add'> setTimeout($.proxy(info.kernel.reconnect, info.kernel), 500);</span> <span class='diff-add'> }, {title: 'click to reconnect'});</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_connected.Kernel', function () {</span> <span class='diff-add'> knw.info("Connected", 500);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_restarting.Kernel', function () {</span> <span class='diff-add'> that.save_widget.update_document_title();</span> <span class='diff-add'> knw.set_message("Restarting kernel", 2000);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_autorestarting.Kernel', function (evt, info) {</span> <span class='diff-add'> // Only show the dialog on the first restart attempt. This</span> <span class='diff-add'> // number gets tracked by the `Kernel` object and passed</span> <span class='diff-add'> // along here, because we don't want to show the user 5</span> <span class='diff-add'> // dialogs saying the same thing (which is the number of</span> <span class='diff-add'> // times it tries restarting).</span> <span class='diff-add'> if (info.attempt === 1) {</span> <span class='diff-add'> dialog.kernel_modal({</span> <span class='diff-add'> notebook: that.notebook,</span> <span class='diff-add'> keyboard_manager: that.keyboard_manager,</span> <span class='diff-add'> title: "Kernel Restarting",</span> <span class='diff-add'> body: "The kernel appears to have died. It will restart automatically.",</span> <span class='diff-add'> buttons: {</span> <span class='diff-add'> OK : {</span> <span class='diff-add'> class : "btn-primary"</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> that.save_widget.update_document_title();</span> <span class='diff-add'> knw.danger("Dead kernel");</span> <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_dead_icon').attr('title','Kernel Dead');</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_interrupting.Kernel', function () {</span> <span class='diff-add'> knw.set_message("Interrupting kernel", 2000);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_disconnected.Kernel', function () {</span> <span class='diff-add'> $kernel_ind_icon</span> <span class='diff-add'> .attr('class', 'kernel_disconnected_icon')</span> <span class='diff-add'> .attr('title', 'No Connection to Kernel');</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_connection_failed.Kernel', function (evt, info) {</span> <span class='diff-add'> // only show the dialog if this is the first failed</span> <span class='diff-add'> // connect attempt, because the kernel will continue</span> <span class='diff-add'> // trying to reconnect and we don't want to spam the user</span> <span class='diff-add'> // with messages</span> <span class='diff-add'> if (info.attempt === 1) {</span> <span class='diff-add'> var msg = "A connection to the notebook server could not be established." +</span> <span class='diff-add'> " The notebook will continue trying to reconnect, but" +</span> <span class='diff-add'> " until it does, you will NOT be able to run code. Check your" +</span> <span class='diff-add'> " network connection or notebook server configuration.";</span> <span class='diff-add'> dialog.kernel_modal({</span> <span class='diff-add'> title: "Connection failed",</span> <span class='diff-add'> body: msg,</span> <span class='diff-add'> keyboard_manager: that.keyboard_manager,</span> <span class='diff-add'> notebook: that.notebook,</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> "OK": {}</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_killed.Kernel kernel_killed.Session', function () {</span> <span class='diff-add'> that.save_widget.update_document_title();</span> <span class='diff-add'> knw.warning("No kernel");</span> <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_busy_icon').attr('title','Kernel is not running');</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_dead.Kernel', function () {</span> <span class='diff-add'> var showMsg = function () {</span> <span class='diff-add'> var msg = 'The kernel has died, and the automatic restart has failed.' +</span> <span class='diff-add'> ' It is possible the kernel cannot be restarted.' +</span> <span class='diff-add'> ' If you are not able to restart the kernel, you will still be able to save' +</span> <span class='diff-add'> ' the notebook, but running code will no longer work until the notebook' +</span> <span class='diff-add'> ' is reopened.';</span> <span class='diff-add'> dialog.kernel_modal({</span> <span class='diff-add'> title: "Dead kernel",</span> <span class='diff-add'> body : msg,</span> <span class='diff-add'> keyboard_manager: that.keyboard_manager,</span> <span class='diff-add'> notebook: that.notebook,</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> "Manual Restart": {</span> <span class='diff-add'> class: "btn-danger",</span> <span class='diff-add'> click: function () {</span> <span class='diff-add'> that.notebook.start_session();</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> "Don't restart": {}</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> return false;</span> <span class='diff-add'> };</span> <span class='diff-add'> that.save_widget.update_document_title();</span> <span class='diff-add'> knw.danger("Dead kernel", undefined, showMsg);</span> <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_dead_icon').attr('title','Kernel Dead');</span> <span class='diff-add'> showMsg();</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> this.events.on("no_kernel.Kernel", function (evt, data) {</span> <span class='diff-add'> $("#kernel_indicator").find('.kernel_indicator_name').text("No Kernel");</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_dead.Session', function (evt, info) {</span> <span class='diff-add'> var full = info.xhr.responseJSON.message;</span> <span class='diff-add'> var short = info.xhr.responseJSON.short_message || 'Kernel error';</span> <span class='diff-add'> var traceback = info.xhr.responseJSON.traceback;</span> <span class='diff-add'> var showMsg = function () {</span> <span class='diff-add'> var msg = $('<div/>').append($('<p/>').text(full));</span> <span class='diff-add'> var cm, cm_elem, cm_open;</span> <span class='diff-add'> if (traceback) {</span> <span class='diff-add'> cm_elem = $('<div/>')</span> <span class='diff-add'> .css('margin-top', '1em')</span> <span class='diff-add'> .css('padding', '1em')</span> <span class='diff-add'> .addClass('output_scroll');</span> <span class='diff-add'> msg.append(cm_elem);</span> <span class='diff-add'> cm = CodeMirror(cm_elem.get(0), {</span> <span class='diff-add'> mode: "python",</span> <span class='diff-add'> readOnly : true</span> <span class='diff-add'> });</span> <span class='diff-add'> cm.setValue(traceback);</span> <span class='diff-add'> cm_open = $.proxy(cm.refresh, cm);</span> <span class='diff-add'> }</span> <span class='diff-add'> dialog.kernel_modal({</span> <span class='diff-add'> title: "Failed to start the kernel",</span> <span class='diff-add'> body : msg,</span> <span class='diff-add'> keyboard_manager: that.keyboard_manager,</span> <span class='diff-add'> notebook: that.notebook,</span> <span class='diff-add'> open: cm_open,</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> "Ok": { class: 'btn-primary' }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> return false;</span> <span class='diff-add'> };</span> <span class='diff-add'> that.save_widget.update_document_title();</span> <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_dead_icon').attr('title','Kernel Dead');</span> <span class='diff-add'> knw.danger(short, undefined, showMsg);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_starting.Kernel kernel_created.Session', function () {</span> <span class='diff-add'> window.document.title='(Starting) '+window.document.title;</span> <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_busy_icon').attr('title','Kernel Busy');</span> <span class='diff-add'> knw.set_message("Kernel starting, please wait...");</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_ready.Kernel', function () {</span> <span class='diff-add'> that.save_widget.update_document_title();</span> <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_idle_icon').attr('title','Kernel Idle');</span> <span class='diff-add'> knw.info("Kernel ready", 500);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_idle.Kernel', function () {</span> <span class='diff-add'> that.save_widget.update_document_title();</span> <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_idle_icon').attr('title','Kernel Idle');</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('kernel_busy.Kernel', function () {</span> <span class='diff-add'> window.document.title='(Busy) '+window.document.title;</span> <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_busy_icon').attr('title','Kernel Busy');</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('spec_match_found.Kernel', function (evt, data) {</span> <span class='diff-add'> that.widget('kernelspec').info("Using kernel: " + data.found.spec.display_name, 3000, undefined, {</span> <span class='diff-add'> title: "Only candidate for language: " + data.selected.language + " was " + data.found.spec.display_name</span> <span class='diff-add'> });</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> // Start the kernel indicator in the busy state, and send a kernel_info request.</span> <span class='diff-add'> // When the kernel_info reply arrives, the kernel is idle.</span> <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_busy_icon').attr('title','Kernel Busy');</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Initialize the notification widget for notebook status messages.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method init_notebook_notification_widget</span> <span class='diff-add'> */</span> <span class='diff-add'> NotebookNotificationArea.prototype.init_notebook_notification_widget = function () {</span> <span class='diff-add'> var nnw = this.new_notification_widget('notebook');</span> <span class='diff-add'> // Notebook events</span> <span class='diff-add'> this.events.on('notebook_loading.Notebook', function () {</span> <span class='diff-add'> nnw.set_message("Loading notebook",500);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('notebook_loaded.Notebook', function () {</span> <span class='diff-add'> nnw.set_message("Notebook loaded",500);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('notebook_saving.Notebook', function () {</span> <span class='diff-add'> nnw.set_message("Saving notebook",500);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('notebook_saved.Notebook', function () {</span> <span class='diff-add'> nnw.set_message("Notebook saved",2000);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('notebook_save_failed.Notebook', function (evt, error) {</span> <span class='diff-add'> nnw.warning(error.message || "Notebook save failed");</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('notebook_copy_failed.Notebook', function (evt, error) {</span> <span class='diff-add'> nnw.warning(error.message || "Notebook copy failed");</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> // Checkpoint events</span> <span class='diff-add'> this.events.on('checkpoint_created.Notebook', function (evt, data) {</span> <span class='diff-add'> var msg = "Checkpoint created";</span> <span class='diff-add'> if (data.last_modified) {</span> <span class='diff-add'> var d = new Date(data.last_modified);</span> <span class='diff-add'> msg = msg + ": " + moment(d).format("HH:mm:ss");</span> <span class='diff-add'> }</span> <span class='diff-add'> nnw.set_message(msg, 2000);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('checkpoint_failed.Notebook', function () {</span> <span class='diff-add'> nnw.warning("Checkpoint failed");</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('checkpoint_deleted.Notebook', function () {</span> <span class='diff-add'> nnw.set_message("Checkpoint deleted", 500);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('checkpoint_delete_failed.Notebook', function () {</span> <span class='diff-add'> nnw.warning("Checkpoint delete failed");</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('checkpoint_restoring.Notebook', function () {</span> <span class='diff-add'> nnw.set_message("Restoring to checkpoint...", 500);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('checkpoint_restore_failed.Notebook', function () {</span> <span class='diff-add'> nnw.warning("Checkpoint restore failed");</span> <span class='diff-add'> });</span> <span class='diff-add'> // Autosave events</span> <span class='diff-add'> this.events.on('autosave_disabled.Notebook', function () {</span> <span class='diff-add'> nnw.set_message("Autosave disabled", 2000);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('autosave_enabled.Notebook', function (evt, interval) {</span> <span class='diff-add'> nnw.set_message("Saving every " + interval / 1000 + "s", 1000);</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatibility.</span> <span class='diff-add'> IPython.NotificationArea = NotebookNotificationArea;</span> <span class='diff-add'> </span> <span class='diff-add'> return {'NotebookNotificationArea': NotebookNotificationArea};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/notificationwidget.js b/ipynb/Array-feature-overlap-05_files/notificationwidget.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..303ca2b</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/notificationwidget.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'>], function(IPython, $) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Construct a NotificationWidget object.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {string} selector - a jQuery selector string for the</span> <span class='diff-add'> * notification widget element</span> <span class='diff-add'> */</span> <span class='diff-add'> var NotificationWidget = function (selector) {</span> <span class='diff-add'> this.selector = selector;</span> <span class='diff-add'> this.timeout = null;</span> <span class='diff-add'> this.busy = false;</span> <span class='diff-add'> if (this.selector !== undefined) {</span> <span class='diff-add'> this.element = $(selector);</span> <span class='diff-add'> this.style();</span> <span class='diff-add'> }</span> <span class='diff-add'> this.element.hide();</span> <span class='diff-add'> this.inner = $('<span/>');</span> <span class='diff-add'> this.element.append(this.inner);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Add the 'notification_widget' CSS class to the widget element.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method style</span> <span class='diff-add'> */</span> <span class='diff-add'> NotificationWidget.prototype.style = function () {</span> <span class='diff-add'> // use explicit bootstrap classes here,</span> <span class='diff-add'> // because multiple inheritance in LESS doesn't work</span> <span class='diff-add'> // for this particular combination</span> <span class='diff-add'> this.element.addClass('notification_widget btn btn-xs navbar-btn');</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * hide the widget and empty the text</span> <span class='diff-add'> **/</span> <span class='diff-add'> NotificationWidget.prototype.hide = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.element.fadeOut(100, function(){that.inner.text('');});</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set the notification widget message to display for a certain</span> <span class='diff-add'> * amount of time (timeout). The widget will be shown forever if</span> <span class='diff-add'> * timeout is <= 0 or undefined. If the widget is clicked while it</span> <span class='diff-add'> * is still displayed, execute an optional callback</span> <span class='diff-add'> * (click_callback). If the callback returns false, it will</span> <span class='diff-add'> * prevent the notification from being dismissed.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Options:</span> <span class='diff-add'> * class - CSS class name for styling</span> <span class='diff-add'> * icon - CSS class name for the widget icon</span> <span class='diff-add'> * title - HTML title attribute for the widget</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method set_message</span> <span class='diff-add'> * @param {string} msg - The notification to display</span> <span class='diff-add'> * @param {integer} [timeout] - The amount of time in milliseconds to display the widget</span> <span class='diff-add'> * @param {function} [click_callback] - The function to run when the widget is clicked</span> <span class='diff-add'> * @param {Object} [options] - Additional options</span> <span class='diff-add'> */</span> <span class='diff-add'> NotificationWidget.prototype.set_message = function (msg, timeout, click_callback, options) {</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> // unbind potential previous callback</span> <span class='diff-add'> this.element.unbind('click');</span> <span class='diff-add'> this.inner.attr('class', options.icon);</span> <span class='diff-add'> this.inner.attr('title', options.title);</span> <span class='diff-add'> this.inner.text(msg);</span> <span class='diff-add'> this.element.fadeIn(100);</span> <span class='diff-add'> // reset previous set style</span> <span class='diff-add'> this.element.removeClass();</span> <span class='diff-add'> this.style();</span> <span class='diff-add'> if (options.class) {</span> <span class='diff-add'> this.element.addClass(options.class);</span> <span class='diff-add'> }</span> <span class='diff-add'> // clear previous timer</span> <span class='diff-add'> if (this.timeout !== null) {</span> <span class='diff-add'> clearTimeout(this.timeout);</span> <span class='diff-add'> this.timeout = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> // set the timer if a timeout is given</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> if (timeout !== undefined && timeout >= 0) {</span> <span class='diff-add'> this.timeout = setTimeout(function () {</span> <span class='diff-add'> that.element.fadeOut(100, function () {that.inner.text('');});</span> <span class='diff-add'> that.element.unbind('click');</span> <span class='diff-add'> that.timeout = null;</span> <span class='diff-add'> }, timeout);</span> <span class='diff-add'> }</span> <span class='diff-add'> // if no click callback assume we will just dismiss the notification</span> <span class='diff-add'> if (click_callback === undefined) {</span> <span class='diff-add'> click_callback = function(){return true};</span> <span class='diff-add'> }</span> <span class='diff-add'> // on click, remove widget if click callback say so</span> <span class='diff-add'> // and unbind click event.</span> <span class='diff-add'> this.element.click(function () {</span> <span class='diff-add'> if (click_callback() !== false) {</span> <span class='diff-add'> that.element.fadeOut(100, function () {that.inner.text('');});</span> <span class='diff-add'> that.element.unbind('click');</span> <span class='diff-add'> }</span> <span class='diff-add'> if (that.timeout !== null) {</span> <span class='diff-add'> clearTimeout(that.timeout);</span> <span class='diff-add'> that.timeout = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Display an information message (styled with the 'info'</span> <span class='diff-add'> * class). Arguments are the same as in set_message. Default</span> <span class='diff-add'> * timeout is 3500 milliseconds.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method info</span> <span class='diff-add'> */</span> <span class='diff-add'> NotificationWidget.prototype.info = function (msg, timeout, click_callback, options) {</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> options.class = options.class + ' info';</span> <span class='diff-add'> timeout = timeout || 3500;</span> <span class='diff-add'> this.set_message(msg, timeout, click_callback, options);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Display a warning message (styled with the 'warning'</span> <span class='diff-add'> * class). Arguments are the same as in set_message. Messages are</span> <span class='diff-add'> * sticky by default.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method warning</span> <span class='diff-add'> */</span> <span class='diff-add'> NotificationWidget.prototype.warning = function (msg, timeout, click_callback, options) {</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> options.class = options.class + ' warning';</span> <span class='diff-add'> this.set_message(msg, timeout, click_callback, options);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Display a danger message (styled with the 'danger'</span> <span class='diff-add'> * class). Arguments are the same as in set_message. Messages are</span> <span class='diff-add'> * sticky by default.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method danger</span> <span class='diff-add'> */</span> <span class='diff-add'> NotificationWidget.prototype.danger = function (msg, timeout, click_callback, options) {</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> options.class = options.class + ' danger';</span> <span class='diff-add'> this.set_message(msg, timeout, click_callback, options);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get the text of the widget message.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method get_message</span> <span class='diff-add'> * @return {string} - the message text</span> <span class='diff-add'> */</span> <span class='diff-add'> NotificationWidget.prototype.get_message = function () {</span> <span class='diff-add'> return this.inner.html();</span> <span class='diff-add'> };</span> <span class='diff-add'> // For backwards compatibility.</span> <span class='diff-add'> IPython.NotificationWidget = NotificationWidget;</span> <span class='diff-add'> return {'NotificationWidget': NotificationWidget};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/outputarea.js b/ipynb/Array-feature-overlap-05_files/outputarea.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..571bfa7</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/outputarea.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jqueryui',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> 'base/js/security',</span> <span class='diff-add'> 'base/js/keyboard',</span> <span class='diff-add'> 'notebook/js/mathjaxutils',</span> <span class='diff-add'> 'components/marked/lib/marked',</span> <span class='diff-add'>], function(IPython, $, utils, security, keyboard, mathjaxutils, marked) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @class OutputArea</span> <span class='diff-add'> *</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> */</span> <span class='diff-add'> var OutputArea = function (options) {</span> <span class='diff-add'> this.selector = options.selector;</span> <span class='diff-add'> this.events = options.events;</span> <span class='diff-add'> this.keyboard_manager = options.keyboard_manager;</span> <span class='diff-add'> this.wrapper = $(options.selector);</span> <span class='diff-add'> this.outputs = [];</span> <span class='diff-add'> this.collapsed = false;</span> <span class='diff-add'> this.scrolled = false;</span> <span class='diff-add'> this.scroll_state = 'auto';</span> <span class='diff-add'> this.trusted = true;</span> <span class='diff-add'> this.clear_queued = null;</span> <span class='diff-add'> if (options.prompt_area === undefined) {</span> <span class='diff-add'> this.prompt_area = true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.prompt_area = options.prompt_area;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.create_elements();</span> <span class='diff-add'> this.style();</span> <span class='diff-add'> this.bind_events();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Class prototypes</span> <span class='diff-add'> **/</span> <span class='diff-add'> OutputArea.prototype.create_elements = function () {</span> <span class='diff-add'> this.element = $("<div/>");</span> <span class='diff-add'> this.collapse_button = $("<div/>");</span> <span class='diff-add'> this.prompt_overlay = $("<div/>");</span> <span class='diff-add'> this.wrapper.append(this.prompt_overlay);</span> <span class='diff-add'> this.wrapper.append(this.element);</span> <span class='diff-add'> this.wrapper.append(this.collapse_button);</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.style = function () {</span> <span class='diff-add'> this.collapse_button.hide();</span> <span class='diff-add'> this.prompt_overlay.hide();</span> <span class='diff-add'> </span> <span class='diff-add'> this.wrapper.addClass('output_wrapper');</span> <span class='diff-add'> this.element.addClass('output');</span> <span class='diff-add'> </span> <span class='diff-add'> this.collapse_button.addClass("btn btn-default output_collapsed");</span> <span class='diff-add'> this.collapse_button.attr('title', 'click to expand output');</span> <span class='diff-add'> this.collapse_button.text('. . .');</span> <span class='diff-add'> </span> <span class='diff-add'> this.prompt_overlay.addClass('out_prompt_overlay prompt');</span> <span class='diff-add'> this.prompt_overlay.attr('title', 'click to expand output; double click to hide output');</span> <span class='diff-add'> </span> <span class='diff-add'> this.collapse();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Should the OutputArea scroll?</span> <span class='diff-add'> * Returns whether the height (in lines) exceeds the current threshold.</span> <span class='diff-add'> * Threshold will be OutputArea.minimum_scroll_threshold if scroll_state=true (manually requested)</span> <span class='diff-add'> * or OutputArea.auto_scroll_threshold if scroll_state='auto'.</span> <span class='diff-add'> * This will always return false if scroll_state=false (scroll disabled).</span> <span class='diff-add'> *</span> <span class='diff-add'> */</span> <span class='diff-add'> OutputArea.prototype._should_scroll = function () {</span> <span class='diff-add'> var threshold;</span> <span class='diff-add'> if (this.scroll_state === false) {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> } else if (this.scroll_state === true) {</span> <span class='diff-add'> threshold = OutputArea.minimum_scroll_threshold;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> threshold = OutputArea.auto_scroll_threshold;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (threshold <=0) {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> // line-height from http://stackoverflow.com/questions/1185151</span> <span class='diff-add'> var fontSize = this.element.css('font-size');</span> <span class='diff-add'> var lineHeight = Math.floor(parseInt(fontSize.replace('px','')) * 1.5);</span> <span class='diff-add'> return (this.element.height() > threshold * lineHeight);</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.bind_events = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.prompt_overlay.dblclick(function () { that.toggle_output(); });</span> <span class='diff-add'> this.prompt_overlay.click(function () { that.toggle_scroll(); });</span> <span class='diff-add'> this.element.resize(function () {</span> <span class='diff-add'> // FIXME: Firefox on Linux misbehaves, so automatic scrolling is disabled</span> <span class='diff-add'> if ( utils.browser[0] === "Firefox" ) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> // maybe scroll output,</span> <span class='diff-add'> // if it's grown large enough and hasn't already been scrolled.</span> <span class='diff-add'> if (!that.scrolled && that._should_scroll()) {</span> <span class='diff-add'> that.scroll_area();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> this.collapse_button.click(function () {</span> <span class='diff-add'> that.expand();</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.collapse = function () {</span> <span class='diff-add'> if (!this.collapsed) {</span> <span class='diff-add'> this.element.hide();</span> <span class='diff-add'> this.prompt_overlay.hide();</span> <span class='diff-add'> if (this.element.html()){</span> <span class='diff-add'> this.collapse_button.show();</span> <span class='diff-add'> }</span> <span class='diff-add'> this.collapsed = true;</span> <span class='diff-add'> // collapsing output clears scroll state</span> <span class='diff-add'> this.scroll_state = 'auto';</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.expand = function () {</span> <span class='diff-add'> if (this.collapsed) {</span> <span class='diff-add'> this.collapse_button.hide();</span> <span class='diff-add'> this.element.show();</span> <span class='diff-add'> if (this.prompt_area) {</span> <span class='diff-add'> this.prompt_overlay.show();</span> <span class='diff-add'> }</span> <span class='diff-add'> this.collapsed = false;</span> <span class='diff-add'> this.scroll_if_long();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.toggle_output = function () {</span> <span class='diff-add'> if (this.collapsed) {</span> <span class='diff-add'> this.expand();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.collapse();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.scroll_area = function () {</span> <span class='diff-add'> this.element.addClass('output_scroll');</span> <span class='diff-add'> this.prompt_overlay.attr('title', 'click to unscroll output; double click to hide');</span> <span class='diff-add'> this.scrolled = true;</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.unscroll_area = function () {</span> <span class='diff-add'> this.element.removeClass('output_scroll');</span> <span class='diff-add'> this.prompt_overlay.attr('title', 'click to scroll output; double click to hide');</span> <span class='diff-add'> this.scrolled = false;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Scroll OutputArea if height exceeds a threshold.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Threshold is OutputArea.minimum_scroll_threshold if scroll_state = true,</span> <span class='diff-add'> * OutputArea.auto_scroll_threshold if scroll_state='auto'.</span> <span class='diff-add'> *</span> <span class='diff-add'> **/</span> <span class='diff-add'> OutputArea.prototype.scroll_if_long = function () {</span> <span class='diff-add'> var should_scroll = this._should_scroll();</span> <span class='diff-add'> if (!this.scrolled && should_scroll) {</span> <span class='diff-add'> // only allow scrolling long-enough output</span> <span class='diff-add'> this.scroll_area();</span> <span class='diff-add'> } else if (this.scrolled && !should_scroll) {</span> <span class='diff-add'> // scrolled and shouldn't be</span> <span class='diff-add'> this.unscroll_area();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.toggle_scroll = function () {</span> <span class='diff-add'> if (this.scroll_state == 'auto') {</span> <span class='diff-add'> this.scroll_state = !this.scrolled;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.scroll_state = !this.scroll_state;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.scrolled) {</span> <span class='diff-add'> this.unscroll_area();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // only allow scrolling long-enough output</span> <span class='diff-add'> this.scroll_if_long();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // typeset with MathJax if MathJax is available</span> <span class='diff-add'> OutputArea.prototype.typeset = function () {</span> <span class='diff-add'> utils.typeset(this.element);</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.handle_output = function (msg) {</span> <span class='diff-add'> var json = {};</span> <span class='diff-add'> var msg_type = json.output_type = msg.header.msg_type;</span> <span class='diff-add'> var content = msg.content;</span> <span class='diff-add'> if (msg_type === "stream") {</span> <span class='diff-add'> json.text = content.text;</span> <span class='diff-add'> json.name = content.name;</span> <span class='diff-add'> } else if (msg_type === "display_data") {</span> <span class='diff-add'> json.data = content.data;</span> <span class='diff-add'> json.metadata = content.metadata;</span> <span class='diff-add'> } else if (msg_type === "execute_result") {</span> <span class='diff-add'> json.data = content.data;</span> <span class='diff-add'> json.metadata = content.metadata;</span> <span class='diff-add'> json.execution_count = content.execution_count;</span> <span class='diff-add'> } else if (msg_type === "error") {</span> <span class='diff-add'> json.ename = content.ename;</span> <span class='diff-add'> json.evalue = content.evalue;</span> <span class='diff-add'> json.traceback = content.traceback;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> console.log("unhandled output message", msg);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.append_output(json);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> </span> <span class='diff-add'> OutputArea.output_types = [</span> <span class='diff-add'> 'application/javascript',</span> <span class='diff-add'> 'text/html',</span> <span class='diff-add'> 'text/markdown',</span> <span class='diff-add'> 'text/latex',</span> <span class='diff-add'> 'image/svg+xml',</span> <span class='diff-add'> 'image/png',</span> <span class='diff-add'> 'image/jpeg',</span> <span class='diff-add'> 'application/pdf',</span> <span class='diff-add'> 'text/plain'</span> <span class='diff-add'> ];</span> <span class='diff-add'> OutputArea.prototype.validate_mimebundle = function (bundle) {</span> <span class='diff-add'> /** scrub invalid outputs */</span> <span class='diff-add'> if (typeof bundle.data !== 'object') {</span> <span class='diff-add'> console.warn("mimebundle missing data", bundle);</span> <span class='diff-add'> bundle.data = {};</span> <span class='diff-add'> }</span> <span class='diff-add'> if (typeof bundle.metadata !== 'object') {</span> <span class='diff-add'> console.warn("mimebundle missing metadata", bundle);</span> <span class='diff-add'> bundle.metadata = {};</span> <span class='diff-add'> }</span> <span class='diff-add'> var data = bundle.data;</span> <span class='diff-add'> $.map(OutputArea.output_types, function(key){</span> <span class='diff-add'> if (key !== 'application/json' &&</span> <span class='diff-add'> data[key] !== undefined &&</span> <span class='diff-add'> typeof data[key] !== 'string'</span> <span class='diff-add'> ) {</span> <span class='diff-add'> console.log("Invalid type for " + key, data[key]);</span> <span class='diff-add'> delete data[key];</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> return bundle;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> OutputArea.prototype.append_output = function (json) {</span> <span class='diff-add'> this.expand();</span> <span class='diff-add'> </span> <span class='diff-add'> // Clear the output if clear is queued.</span> <span class='diff-add'> var needs_height_reset = false;</span> <span class='diff-add'> if (this.clear_queued) {</span> <span class='diff-add'> this.clear_output(false);</span> <span class='diff-add'> needs_height_reset = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> var record_output = true;</span> <span class='diff-add'> switch(json.output_type) {</span> <span class='diff-add'> case 'execute_result':</span> <span class='diff-add'> json = this.validate_mimebundle(json);</span> <span class='diff-add'> this.append_execute_result(json);</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'stream':</span> <span class='diff-add'> // append_stream might have merged the output with earlier stream output</span> <span class='diff-add'> record_output = this.append_stream(json);</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'error':</span> <span class='diff-add'> this.append_error(json);</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'display_data':</span> <span class='diff-add'> // append handled below</span> <span class='diff-add'> json = this.validate_mimebundle(json);</span> <span class='diff-add'> break;</span> <span class='diff-add'> default:</span> <span class='diff-add'> console.log("unrecognized output type: " + json.output_type);</span> <span class='diff-add'> this.append_unrecognized(json);</span> <span class='diff-add'> }</span> <span class='diff-add'> // We must release the animation fixed height in a callback since Gecko</span> <span class='diff-add'> // (FireFox) doesn't render the image immediately as the data is </span> <span class='diff-add'> // available.</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var handle_appended = function ($el) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Only reset the height to automatic if the height is currently</span> <span class='diff-add'> * fixed (done by wait=True flag on clear_output).</span> <span class='diff-add'> */</span> <span class='diff-add'> if (needs_height_reset) {</span> <span class='diff-add'> that.element.height('');</span> <span class='diff-add'> }</span> <span class='diff-add'> that.element.trigger('resize');</span> <span class='diff-add'> };</span> <span class='diff-add'> if (json.output_type === 'display_data') {</span> <span class='diff-add'> this.append_display_data(json, handle_appended);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> handle_appended();</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> if (record_output) {</span> <span class='diff-add'> this.outputs.push(json);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.create_output_area = function () {</span> <span class='diff-add'> var oa = $("<div/>").addClass("output_area");</span> <span class='diff-add'> if (this.prompt_area) {</span> <span class='diff-add'> oa.append($('<div/>').addClass('prompt'));</span> <span class='diff-add'> }</span> <span class='diff-add'> return oa;</span> <span class='diff-add'> };</span> <span class='diff-add'> function _get_metadata_key(metadata, key, mime) {</span> <span class='diff-add'> var mime_md = metadata[mime];</span> <span class='diff-add'> // mime-specific higher priority</span> <span class='diff-add'> if (mime_md && mime_md[key] !== undefined) {</span> <span class='diff-add'> return mime_md[key];</span> <span class='diff-add'> }</span> <span class='diff-add'> // fallback on global</span> <span class='diff-add'> return metadata[key];</span> <span class='diff-add'> }</span> <span class='diff-add'> OutputArea.prototype.create_output_subarea = function(md, classes, mime) {</span> <span class='diff-add'> var subarea = $('<div/>').addClass('output_subarea').addClass(classes);</span> <span class='diff-add'> if (_get_metadata_key(md, 'isolated', mime)) {</span> <span class='diff-add'> // Create an iframe to isolate the subarea from the rest of the</span> <span class='diff-add'> // document</span> <span class='diff-add'> var iframe = $('<iframe/>').addClass('box-flex1');</span> <span class='diff-add'> iframe.css({'height':1, 'width':'100%', 'display':'block'});</span> <span class='diff-add'> iframe.attr('frameborder', 0);</span> <span class='diff-add'> iframe.attr('scrolling', 'auto');</span> <span class='diff-add'> // Once the iframe is loaded, the subarea is dynamically inserted</span> <span class='diff-add'> iframe.on('load', function() {</span> <span class='diff-add'> // Workaround needed by Firefox, to properly render svg inside</span> <span class='diff-add'> // iframes, see http://stackoverflow.com/questions/10177190/</span> <span class='diff-add'> // svg-dynamically-added-to-iframe-does-not-render-correctly</span> <span class='diff-add'> this.contentDocument.open();</span> <span class='diff-add'> // Insert the subarea into the iframe</span> <span class='diff-add'> // We must directly write the html. When using Jquery's append</span> <span class='diff-add'> // method, javascript is evaluated in the parent document and</span> <span class='diff-add'> // not in the iframe document. At this point, subarea doesn't</span> <span class='diff-add'> // contain any user content.</span> <span class='diff-add'> this.contentDocument.write(subarea.html());</span> <span class='diff-add'> this.contentDocument.close();</span> <span class='diff-add'> var body = this.contentDocument.body;</span> <span class='diff-add'> // Adjust the iframe height automatically</span> <span class='diff-add'> iframe.height(body.scrollHeight + 'px');</span> <span class='diff-add'> });</span> <span class='diff-add'> // Elements should be appended to the inner subarea and not to the</span> <span class='diff-add'> // iframe</span> <span class='diff-add'> iframe.append = function(that) {</span> <span class='diff-add'> subarea.append(that);</span> <span class='diff-add'> };</span> <span class='diff-add'> return iframe;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return subarea;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype._append_javascript_error = function (err, element) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * display a message when a javascript error occurs in display output</span> <span class='diff-add'> */</span> <span class='diff-add'> var msg = "Javascript error adding output!";</span> <span class='diff-add'> if ( element === undefined ) return;</span> <span class='diff-add'> element</span> <span class='diff-add'> .append($('<div/>').text(msg).addClass('js-error'))</span> <span class='diff-add'> .append($('<div/>').text(err.toString()).addClass('js-error'))</span> <span class='diff-add'> .append($('<div/>').text('See your browser Javascript console for more details.').addClass('js-error'));</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> OutputArea.prototype._safe_append = function (toinsert) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * safely append an item to the document</span> <span class='diff-add'> * this is an object created by user code,</span> <span class='diff-add'> * and may have errors, which should not be raised</span> <span class='diff-add'> * under any circumstances.</span> <span class='diff-add'> */</span> <span class='diff-add'> try {</span> <span class='diff-add'> this.element.append(toinsert);</span> <span class='diff-add'> } catch(err) {</span> <span class='diff-add'> console.log(err);</span> <span class='diff-add'> // Create an actual output_area and output_subarea, which creates</span> <span class='diff-add'> // the prompt area and the proper indentation.</span> <span class='diff-add'> var toinsert = this.create_output_area();</span> <span class='diff-add'> var subarea = $('<div/>').addClass('output_subarea');</span> <span class='diff-add'> toinsert.append(subarea);</span> <span class='diff-add'> this._append_javascript_error(err, subarea);</span> <span class='diff-add'> this.element.append(toinsert);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Notify others of changes.</span> <span class='diff-add'> this.element.trigger('changed');</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.append_execute_result = function (json) {</span> <span class='diff-add'> var n = json.execution_count || ' ';</span> <span class='diff-add'> var toinsert = this.create_output_area();</span> <span class='diff-add'> if (this.prompt_area) {</span> <span class='diff-add'> toinsert.find('div.prompt').addClass('output_prompt').text('Out[' + n + ']:');</span> <span class='diff-add'> }</span> <span class='diff-add'> var inserted = this.append_mime_type(json, toinsert);</span> <span class='diff-add'> if (inserted) {</span> <span class='diff-add'> inserted.addClass('output_result');</span> <span class='diff-add'> }</span> <span class='diff-add'> this._safe_append(toinsert);</span> <span class='diff-add'> // If we just output latex, typeset it.</span> <span class='diff-add'> if ((json.data['text/latex'] !== undefined) ||</span> <span class='diff-add'> (json.data['text/html'] !== undefined) ||</span> <span class='diff-add'> (json.data['text/markdown'] !== undefined)) {</span> <span class='diff-add'> this.typeset();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.append_error = function (json) {</span> <span class='diff-add'> var tb = json.traceback;</span> <span class='diff-add'> if (tb !== undefined && tb.length > 0) {</span> <span class='diff-add'> var s = '';</span> <span class='diff-add'> var len = tb.length;</span> <span class='diff-add'> for (var i=0; i<len; i++) {</span> <span class='diff-add'> s = s + tb[i] + '\n';</span> <span class='diff-add'> }</span> <span class='diff-add'> s = s + '\n';</span> <span class='diff-add'> var toinsert = this.create_output_area();</span> <span class='diff-add'> var append_text = OutputArea.append_map['text/plain'];</span> <span class='diff-add'> if (append_text) {</span> <span class='diff-add'> append_text.apply(this, [s, {}, toinsert]).addClass('output_error');</span> <span class='diff-add'> }</span> <span class='diff-add'> this._safe_append(toinsert);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.append_stream = function (json) {</span> <span class='diff-add'> var text = json.text;</span> <span class='diff-add'> if (typeof text !== 'string') {</span> <span class='diff-add'> console.error("Stream output is invalid (missing text)", json);</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> var subclass = "output_"+json.name;</span> <span class='diff-add'> if (this.outputs.length > 0){</span> <span class='diff-add'> // have at least one output to consider</span> <span class='diff-add'> var last = this.outputs[this.outputs.length-1];</span> <span class='diff-add'> if (last.output_type == 'stream' && json.name == last.name){</span> <span class='diff-add'> // latest output was in the same stream,</span> <span class='diff-add'> // so append directly into its pre tag</span> <span class='diff-add'> // escape ANSI & HTML specials:</span> <span class='diff-add'> last.text = utils.fixCarriageReturn(last.text + json.text);</span> <span class='diff-add'> var pre = this.element.find('div.'+subclass).last().find('pre');</span> <span class='diff-add'> var html = utils.fixConsole(last.text);</span> <span class='diff-add'> // The only user content injected with this HTML call is</span> <span class='diff-add'> // escaped by the fixConsole() method.</span> <span class='diff-add'> pre.html(html);</span> <span class='diff-add'> // return false signals that we merged this output with the previous one,</span> <span class='diff-add'> // and the new output shouldn't be recorded.</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!text.replace("\r", "")) {</span> <span class='diff-add'> // text is nothing (empty string, \r, etc.)</span> <span class='diff-add'> // so don't append any elements, which might add undesirable space</span> <span class='diff-add'> // return true to indicate the output should be recorded.</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> // If we got here, attach a new div</span> <span class='diff-add'> var toinsert = this.create_output_area();</span> <span class='diff-add'> var append_text = OutputArea.append_map['text/plain'];</span> <span class='diff-add'> if (append_text) {</span> <span class='diff-add'> append_text.apply(this, [text, {}, toinsert]).addClass("output_stream " + subclass);</span> <span class='diff-add'> }</span> <span class='diff-add'> this._safe_append(toinsert);</span> <span class='diff-add'> return true;</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.append_unrecognized = function (json) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var toinsert = this.create_output_area();</span> <span class='diff-add'> var subarea = $('<div/>').addClass('output_subarea output_unrecognized');</span> <span class='diff-add'> toinsert.append(subarea);</span> <span class='diff-add'> subarea.append(</span> <span class='diff-add'> $("<a>")</span> <span class='diff-add'> .attr("href", "#")</span> <span class='diff-add'> .text("Unrecognized output: " + json.output_type)</span> <span class='diff-add'> .click(function () {</span> <span class='diff-add'> that.events.trigger('unrecognized_output.OutputArea', {output: json});</span> <span class='diff-add'> })</span> <span class='diff-add'> );</span> <span class='diff-add'> this._safe_append(toinsert);</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.append_display_data = function (json, handle_inserted) {</span> <span class='diff-add'> var toinsert = this.create_output_area();</span> <span class='diff-add'> if (this.append_mime_type(json, toinsert, handle_inserted)) {</span> <span class='diff-add'> this._safe_append(toinsert);</span> <span class='diff-add'> // If we just output latex, typeset it.</span> <span class='diff-add'> if ((json.data['text/latex'] !== undefined) ||</span> <span class='diff-add'> (json.data['text/html'] !== undefined) ||</span> <span class='diff-add'> (json.data['text/markdown'] !== undefined)) {</span> <span class='diff-add'> this.typeset();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.safe_outputs = {</span> <span class='diff-add'> 'text/plain' : true,</span> <span class='diff-add'> 'text/latex' : true,</span> <span class='diff-add'> 'image/png' : true,</span> <span class='diff-add'> 'image/jpeg' : true</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> OutputArea.prototype.append_mime_type = function (json, element, handle_inserted) {</span> <span class='diff-add'> for (var i=0; i < OutputArea.display_order.length; i++) {</span> <span class='diff-add'> var type = OutputArea.display_order[i];</span> <span class='diff-add'> var append = OutputArea.append_map[type];</span> <span class='diff-add'> if ((json.data[type] !== undefined) && append) {</span> <span class='diff-add'> var value = json.data[type];</span> <span class='diff-add'> if (!this.trusted && !OutputArea.safe_outputs[type]) {</span> <span class='diff-add'> // not trusted, sanitize HTML</span> <span class='diff-add'> if (type==='text/html' || type==='text/svg') {</span> <span class='diff-add'> value = security.sanitize_html(value);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // don't display if we don't know how to sanitize it</span> <span class='diff-add'> console.log("Ignoring untrusted " + type + " output.");</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> var md = json.metadata || {};</span> <span class='diff-add'> var toinsert = append.apply(this, [value, md, element, handle_inserted]);</span> <span class='diff-add'> // Since only the png and jpeg mime types call the inserted</span> <span class='diff-add'> // callback, if the mime type is something other we must call the </span> <span class='diff-add'> // inserted callback only when the element is actually inserted</span> <span class='diff-add'> // into the DOM. Use a timeout of 0 to do this.</span> <span class='diff-add'> if (['image/png', 'image/jpeg'].indexOf(type) < 0 && handle_inserted !== undefined) {</span> <span class='diff-add'> setTimeout(handle_inserted, 0);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.events.trigger('output_appended.OutputArea', [type, value, md, toinsert]);</span> <span class='diff-add'> return toinsert;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return null;</span> <span class='diff-add'> };</span> <span class='diff-add'> var append_html = function (html, md, element) {</span> <span class='diff-add'> var type = 'text/html';</span> <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_html rendered_html", type);</span> <span class='diff-add'> this.keyboard_manager.register_events(toinsert);</span> <span class='diff-add'> toinsert.append(html);</span> <span class='diff-add'> element.append(toinsert);</span> <span class='diff-add'> return toinsert;</span> <span class='diff-add'> };</span> <span class='diff-add'> var append_markdown = function(markdown, md, element) {</span> <span class='diff-add'> var type = 'text/markdown';</span> <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_markdown", type);</span> <span class='diff-add'> var text_and_math = mathjaxutils.remove_math(markdown);</span> <span class='diff-add'> var text = text_and_math[0];</span> <span class='diff-add'> var math = text_and_math[1];</span> <span class='diff-add'> marked(text, function (err, html) {</span> <span class='diff-add'> html = mathjaxutils.replace_math(html, math);</span> <span class='diff-add'> toinsert.append(html);</span> <span class='diff-add'> });</span> <span class='diff-add'> element.append(toinsert);</span> <span class='diff-add'> return toinsert;</span> <span class='diff-add'> };</span> <span class='diff-add'> var append_javascript = function (js, md, element) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * We just eval the JS code, element appears in the local scope.</span> <span class='diff-add'> */</span> <span class='diff-add'> var type = 'application/javascript';</span> <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_javascript", type);</span> <span class='diff-add'> this.keyboard_manager.register_events(toinsert);</span> <span class='diff-add'> element.append(toinsert);</span> <span class='diff-add'> // Fix for ipython/issues/5293, make sure `element` is the area which</span> <span class='diff-add'> // output can be inserted into at the time of JS execution.</span> <span class='diff-add'> element = toinsert;</span> <span class='diff-add'> try {</span> <span class='diff-add'> eval(js);</span> <span class='diff-add'> } catch(err) {</span> <span class='diff-add'> console.log(err);</span> <span class='diff-add'> this._append_javascript_error(err, toinsert);</span> <span class='diff-add'> }</span> <span class='diff-add'> return toinsert;</span> <span class='diff-add'> };</span> <span class='diff-add'> var append_text = function (data, md, element) {</span> <span class='diff-add'> var type = 'text/plain';</span> <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_text", type);</span> <span class='diff-add'> // escape ANSI & HTML specials in plaintext:</span> <span class='diff-add'> data = utils.fixConsole(data);</span> <span class='diff-add'> data = utils.fixCarriageReturn(data);</span> <span class='diff-add'> data = utils.autoLinkUrls(data);</span> <span class='diff-add'> // The only user content injected with this HTML call is</span> <span class='diff-add'> // escaped by the fixConsole() method.</span> <span class='diff-add'> toinsert.append($("<pre/>").html(data));</span> <span class='diff-add'> element.append(toinsert);</span> <span class='diff-add'> return toinsert;</span> <span class='diff-add'> };</span> <span class='diff-add'> var append_svg = function (svg_html, md, element) {</span> <span class='diff-add'> var type = 'image/svg+xml';</span> <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_svg", type);</span> <span class='diff-add'> // Get the svg element from within the HTML.</span> <span class='diff-add'> var svg = $('<div />').html(svg_html).find('svg');</span> <span class='diff-add'> var svg_area = $('<div />');</span> <span class='diff-add'> var width = svg.attr('width');</span> <span class='diff-add'> var height = svg.attr('height');</span> <span class='diff-add'> svg</span> <span class='diff-add'> .width('100%')</span> <span class='diff-add'> .height('100%');</span> <span class='diff-add'> svg_area</span> <span class='diff-add'> .width(width)</span> <span class='diff-add'> .height(height);</span> <span class='diff-add'> // The jQuery resize handlers don't seem to work on the svg element.</span> <span class='diff-add'> // When the svg renders completely, measure it's size and set the parent</span> <span class='diff-add'> // div to that size. Then set the svg to 100% the size of the parent</span> <span class='diff-add'> // div and make the parent div resizable. </span> <span class='diff-add'> this._dblclick_to_reset_size(svg_area, true, false);</span> <span class='diff-add'> svg_area.append(svg);</span> <span class='diff-add'> toinsert.append(svg_area);</span> <span class='diff-add'> element.append(toinsert);</span> <span class='diff-add'> return toinsert;</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype._dblclick_to_reset_size = function (img, immediately, resize_parent) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Add a resize handler to an element</span> <span class='diff-add'> *</span> <span class='diff-add'> * img: jQuery element</span> <span class='diff-add'> * immediately: bool=False</span> <span class='diff-add'> * Wait for the element to load before creating the handle.</span> <span class='diff-add'> * resize_parent: bool=True</span> <span class='diff-add'> * Should the parent of the element be resized when the element is</span> <span class='diff-add'> * reset (by double click).</span> <span class='diff-add'> */</span> <span class='diff-add'> var callback = function (){</span> <span class='diff-add'> var h0 = img.height();</span> <span class='diff-add'> var w0 = img.width();</span> <span class='diff-add'> if (!(h0 && w0)) {</span> <span class='diff-add'> // zero size, don't make it resizable</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> img.resizable({</span> <span class='diff-add'> aspectRatio: true,</span> <span class='diff-add'> autoHide: true</span> <span class='diff-add'> });</span> <span class='diff-add'> img.dblclick(function () {</span> <span class='diff-add'> // resize wrapper & image together for some reason:</span> <span class='diff-add'> img.height(h0);</span> <span class='diff-add'> img.width(w0);</span> <span class='diff-add'> if (resize_parent === undefined || resize_parent) {</span> <span class='diff-add'> img.parent().height(h0);</span> <span class='diff-add'> img.parent().width(w0);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> if (immediately) {</span> <span class='diff-add'> callback();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> img.on("load", callback);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var set_width_height = function (img, md, mime) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * set width and height of an img element from metadata</span> <span class='diff-add'> */</span> <span class='diff-add'> var height = _get_metadata_key(md, 'height', mime);</span> <span class='diff-add'> if (height !== undefined) img.attr('height', height);</span> <span class='diff-add'> var width = _get_metadata_key(md, 'width', mime);</span> <span class='diff-add'> if (width !== undefined) img.attr('width', width);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var append_png = function (png, md, element, handle_inserted) {</span> <span class='diff-add'> var type = 'image/png';</span> <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_png", type);</span> <span class='diff-add'> var img = $("<img/>");</span> <span class='diff-add'> if (handle_inserted !== undefined) {</span> <span class='diff-add'> img.on('load', function(){</span> <span class='diff-add'> handle_inserted(img);</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> img[0].src = 'data:image/png;base64,'+ png;</span> <span class='diff-add'> set_width_height(img, md, 'image/png');</span> <span class='diff-add'> this._dblclick_to_reset_size(img);</span> <span class='diff-add'> toinsert.append(img);</span> <span class='diff-add'> element.append(toinsert);</span> <span class='diff-add'> return toinsert;</span> <span class='diff-add'> };</span> <span class='diff-add'> var append_jpeg = function (jpeg, md, element, handle_inserted) {</span> <span class='diff-add'> var type = 'image/jpeg';</span> <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_jpeg", type);</span> <span class='diff-add'> var img = $("<img/>");</span> <span class='diff-add'> if (handle_inserted !== undefined) {</span> <span class='diff-add'> img.on('load', function(){</span> <span class='diff-add'> handle_inserted(img);</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> img[0].src = 'data:image/jpeg;base64,'+ jpeg;</span> <span class='diff-add'> set_width_height(img, md, 'image/jpeg');</span> <span class='diff-add'> this._dblclick_to_reset_size(img);</span> <span class='diff-add'> toinsert.append(img);</span> <span class='diff-add'> element.append(toinsert);</span> <span class='diff-add'> return toinsert;</span> <span class='diff-add'> };</span> <span class='diff-add'> var append_pdf = function (pdf, md, element) {</span> <span class='diff-add'> var type = 'application/pdf';</span> <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_pdf", type);</span> <span class='diff-add'> var a = $('<a/>').attr('href', 'data:application/pdf;base64,'+pdf);</span> <span class='diff-add'> a.attr('target', '_blank');</span> <span class='diff-add'> a.text('View PDF');</span> <span class='diff-add'> toinsert.append(a);</span> <span class='diff-add'> element.append(toinsert);</span> <span class='diff-add'> return toinsert;</span> <span class='diff-add'> };</span> <span class='diff-add'> var append_latex = function (latex, md, element) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * This method cannot do the typesetting because the latex first has to</span> <span class='diff-add'> * be on the page.</span> <span class='diff-add'> */</span> <span class='diff-add'> var type = 'text/latex';</span> <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_latex", type);</span> <span class='diff-add'> toinsert.append(latex);</span> <span class='diff-add'> element.append(toinsert);</span> <span class='diff-add'> return toinsert;</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.append_raw_input = function (msg) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.expand();</span> <span class='diff-add'> var content = msg.content;</span> <span class='diff-add'> var area = this.create_output_area();</span> <span class='diff-add'> </span> <span class='diff-add'> // disable any other raw_inputs, if they are left around</span> <span class='diff-add'> $("div.output_subarea.raw_input_container").remove();</span> <span class='diff-add'> </span> <span class='diff-add'> var input_type = content.password ? 'password' : 'text';</span> <span class='diff-add'> </span> <span class='diff-add'> area.append(</span> <span class='diff-add'> $("<div/>")</span> <span class='diff-add'> .addClass("box-flex1 output_subarea raw_input_container")</span> <span class='diff-add'> .append(</span> <span class='diff-add'> $("<span/>")</span> <span class='diff-add'> .addClass("raw_input_prompt")</span> <span class='diff-add'> .text(content.prompt)</span> <span class='diff-add'> )</span> <span class='diff-add'> .append(</span> <span class='diff-add'> $("<input/>")</span> <span class='diff-add'> .addClass("raw_input")</span> <span class='diff-add'> .attr('type', input_type)</span> <span class='diff-add'> .attr("size", 47)</span> <span class='diff-add'> .keydown(function (event, ui) {</span> <span class='diff-add'> // make sure we submit on enter,</span> <span class='diff-add'> // and don't re-execute the *cell* on shift-enter</span> <span class='diff-add'> if (event.which === keyboard.keycodes.enter) {</span> <span class='diff-add'> that._submit_raw_input();</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> })</span> <span class='diff-add'> )</span> <span class='diff-add'> );</span> <span class='diff-add'> </span> <span class='diff-add'> this.element.append(area);</span> <span class='diff-add'> var raw_input = area.find('input.raw_input');</span> <span class='diff-add'> // Register events that enable/disable the keyboard manager while raw</span> <span class='diff-add'> // input is focused.</span> <span class='diff-add'> this.keyboard_manager.register_events(raw_input);</span> <span class='diff-add'> // Note, the following line used to read raw_input.focus().focus().</span> <span class='diff-add'> // This seemed to be needed otherwise only the cell would be focused.</span> <span class='diff-add'> // But with the modal UI, this seems to work fine with one call to focus().</span> <span class='diff-add'> raw_input.focus();</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype._submit_raw_input = function (evt) {</span> <span class='diff-add'> var container = this.element.find("div.raw_input_container");</span> <span class='diff-add'> var theprompt = container.find("span.raw_input_prompt");</span> <span class='diff-add'> var theinput = container.find("input.raw_input");</span> <span class='diff-add'> var value = theinput.val();</span> <span class='diff-add'> var echo = value;</span> <span class='diff-add'> // don't echo if it's a password</span> <span class='diff-add'> if (theinput.attr('type') == 'password') {</span> <span class='diff-add'> echo = '········';</span> <span class='diff-add'> }</span> <span class='diff-add'> var content = {</span> <span class='diff-add'> output_type : 'stream',</span> <span class='diff-add'> name : 'stdout',</span> <span class='diff-add'> text : theprompt.text() + echo + '\n'</span> <span class='diff-add'> };</span> <span class='diff-add'> // remove form container</span> <span class='diff-add'> container.parent().remove();</span> <span class='diff-add'> // replace with plaintext version in stdout</span> <span class='diff-add'> this.append_output(content, false);</span> <span class='diff-add'> this.events.trigger('send_input_reply.Kernel', value);</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.handle_clear_output = function (msg) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * msg spec v4 had stdout, stderr, display keys</span> <span class='diff-add'> * v4.1 replaced these with just wait</span> <span class='diff-add'> * The default behavior is the same (stdout=stderr=display=True, wait=False),</span> <span class='diff-add'> * so v4 messages will still be properly handled,</span> <span class='diff-add'> * except for the rarely used clearing less than all output.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.clear_output(msg.content.wait || false);</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.clear_output = function(wait, ignore_que) {</span> <span class='diff-add'> if (wait) {</span> <span class='diff-add'> // If a clear is queued, clear before adding another to the queue.</span> <span class='diff-add'> if (this.clear_queued) {</span> <span class='diff-add'> this.clear_output(false);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.clear_queued = true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // Fix the output div's height if the clear_output is waiting for</span> <span class='diff-add'> // new output (it is being used in an animation).</span> <span class='diff-add'> if (!ignore_que && this.clear_queued) {</span> <span class='diff-add'> var height = this.element.height();</span> <span class='diff-add'> this.element.height(height);</span> <span class='diff-add'> this.clear_queued = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> // Clear all</span> <span class='diff-add'> // Remove load event handlers from img tags because we don't want</span> <span class='diff-add'> // them to fire if the image is never added to the page.</span> <span class='diff-add'> this.element.find('img').off('load');</span> <span class='diff-add'> this.element.html("");</span> <span class='diff-add'> // Notify others of changes.</span> <span class='diff-add'> this.element.trigger('changed');</span> <span class='diff-add'> </span> <span class='diff-add'> this.outputs = [];</span> <span class='diff-add'> this.trusted = true;</span> <span class='diff-add'> this.unscroll_area();</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // JSON serialization</span> <span class='diff-add'> OutputArea.prototype.fromJSON = function (outputs, metadata) {</span> <span class='diff-add'> var len = outputs.length;</span> <span class='diff-add'> metadata = metadata || {};</span> <span class='diff-add'> for (var i=0; i<len; i++) {</span> <span class='diff-add'> this.append_output(outputs[i]);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (metadata.collapsed !== undefined) {</span> <span class='diff-add'> if (metadata.collapsed) {</span> <span class='diff-add'> this.collapse();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.expand();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (metadata.scrolled !== undefined) {</span> <span class='diff-add'> this.scroll_state = metadata.scrolled;</span> <span class='diff-add'> if (metadata.scrolled) {</span> <span class='diff-add'> this.scroll_if_long();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.unscroll_area();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> OutputArea.prototype.toJSON = function () {</span> <span class='diff-add'> return this.outputs;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Class properties</span> <span class='diff-add'> **/</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Threshold to trigger autoscroll when the OutputArea is resized,</span> <span class='diff-add'> * typically when new outputs are added.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Behavior is undefined if autoscroll is lower than minimum_scroll_threshold,</span> <span class='diff-add'> * unless it is < 0, in which case autoscroll will never be triggered</span> <span class='diff-add'> *</span> <span class='diff-add'> * @property auto_scroll_threshold</span> <span class='diff-add'> * @type Number</span> <span class='diff-add'> * @default 100</span> <span class='diff-add'> *</span> <span class='diff-add'> **/</span> <span class='diff-add'> OutputArea.auto_scroll_threshold = 100;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Lower limit (in lines) for OutputArea to be made scrollable. OutputAreas</span> <span class='diff-add'> * shorter than this are never scrolled.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @property minimum_scroll_threshold</span> <span class='diff-add'> * @type Number</span> <span class='diff-add'> * @default 20</span> <span class='diff-add'> *</span> <span class='diff-add'> **/</span> <span class='diff-add'> OutputArea.minimum_scroll_threshold = 20;</span> <span class='diff-add'> OutputArea.display_order = [</span> <span class='diff-add'> 'application/javascript',</span> <span class='diff-add'> 'text/html',</span> <span class='diff-add'> 'text/markdown',</span> <span class='diff-add'> 'text/latex',</span> <span class='diff-add'> 'image/svg+xml',</span> <span class='diff-add'> 'image/png',</span> <span class='diff-add'> 'image/jpeg',</span> <span class='diff-add'> 'application/pdf',</span> <span class='diff-add'> 'text/plain'</span> <span class='diff-add'> ];</span> <span class='diff-add'> OutputArea.append_map = {</span> <span class='diff-add'> "text/plain" : append_text,</span> <span class='diff-add'> "text/html" : append_html,</span> <span class='diff-add'> "text/markdown": append_markdown,</span> <span class='diff-add'> "image/svg+xml" : append_svg,</span> <span class='diff-add'> "image/png" : append_png,</span> <span class='diff-add'> "image/jpeg" : append_jpeg,</span> <span class='diff-add'> "text/latex" : append_latex,</span> <span class='diff-add'> "application/javascript" : append_javascript,</span> <span class='diff-add'> "application/pdf" : append_pdf</span> <span class='diff-add'> };</span> <span class='diff-add'> // For backwards compatability.</span> <span class='diff-add'> IPython.OutputArea = OutputArea;</span> <span class='diff-add'> return {'OutputArea': OutputArea};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/overlay.js b/ipynb/Array-feature-overlap-05_files/overlay.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..e1b9ed3</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/overlay.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span> <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span> <span class='diff-add'>// Utility function that allows modes to be combined. The mode given</span> <span class='diff-add'>// as the base argument takes care of most of the normal mode</span> <span class='diff-add'>// functionality, but a second (typically simple) mode is used, which</span> <span class='diff-add'>// can override the style of text. Both modes get to parse all of the</span> <span class='diff-add'>// text, but when both assign a non-null style to a piece of code, the</span> <span class='diff-add'>// overlay wins, unless the combine argument was true and not overridden,</span> <span class='diff-add'>// or state.overlay.combineTokens was true, in which case the styles are</span> <span class='diff-add'>// combined.</span> <span class='diff-add'>(function(mod) {</span> <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span> <span class='diff-add'> mod(require("../../lib/codemirror"));</span> <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span> <span class='diff-add'> define(["../../lib/codemirror"], mod);</span> <span class='diff-add'> else // Plain browser env</span> <span class='diff-add'> mod(CodeMirror);</span> <span class='diff-add'>})(function(CodeMirror) {</span> <span class='diff-add'>"use strict";</span> <span class='diff-add'>CodeMirror.overlayMode = function(base, overlay, combine) {</span> <span class='diff-add'> return {</span> <span class='diff-add'> startState: function() {</span> <span class='diff-add'> return {</span> <span class='diff-add'> base: CodeMirror.startState(base),</span> <span class='diff-add'> overlay: CodeMirror.startState(overlay),</span> <span class='diff-add'> basePos: 0, baseCur: null,</span> <span class='diff-add'> overlayPos: 0, overlayCur: null,</span> <span class='diff-add'> streamSeen: null</span> <span class='diff-add'> };</span> <span class='diff-add'> },</span> <span class='diff-add'> copyState: function(state) {</span> <span class='diff-add'> return {</span> <span class='diff-add'> base: CodeMirror.copyState(base, state.base),</span> <span class='diff-add'> overlay: CodeMirror.copyState(overlay, state.overlay),</span> <span class='diff-add'> basePos: state.basePos, baseCur: null,</span> <span class='diff-add'> overlayPos: state.overlayPos, overlayCur: null</span> <span class='diff-add'> };</span> <span class='diff-add'> },</span> <span class='diff-add'> token: function(stream, state) {</span> <span class='diff-add'> if (stream != state.streamSeen ||</span> <span class='diff-add'> Math.min(state.basePos, state.overlayPos) < stream.start) {</span> <span class='diff-add'> state.streamSeen = stream;</span> <span class='diff-add'> state.basePos = state.overlayPos = stream.start;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (stream.start == state.basePos) {</span> <span class='diff-add'> state.baseCur = base.token(stream, state.base);</span> <span class='diff-add'> state.basePos = stream.pos;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (stream.start == state.overlayPos) {</span> <span class='diff-add'> stream.pos = stream.start;</span> <span class='diff-add'> state.overlayCur = overlay.token(stream, state.overlay);</span> <span class='diff-add'> state.overlayPos = stream.pos;</span> <span class='diff-add'> }</span> <span class='diff-add'> stream.pos = Math.min(state.basePos, state.overlayPos);</span> <span class='diff-add'> // state.overlay.combineTokens always takes precedence over combine,</span> <span class='diff-add'> // unless set to null</span> <span class='diff-add'> if (state.overlayCur == null) return state.baseCur;</span> <span class='diff-add'> else if (state.baseCur != null &&</span> <span class='diff-add'> state.overlay.combineTokens ||</span> <span class='diff-add'> combine && state.overlay.combineTokens == null)</span> <span class='diff-add'> return state.baseCur + " " + state.overlayCur;</span> <span class='diff-add'> else return state.overlayCur;</span> <span class='diff-add'> },</span> <span class='diff-add'> indent: base.indent && function(state, textAfter) {</span> <span class='diff-add'> return base.indent(state.base, textAfter);</span> <span class='diff-add'> },</span> <span class='diff-add'> electricChars: base.electricChars,</span> <span class='diff-add'> innerMode: function(state) { return {state: state.base, mode: base}; },</span> <span class='diff-add'> blankLine: function(state) {</span> <span class='diff-add'> if (base.blankLine) base.blankLine(state.base);</span> <span class='diff-add'> if (overlay.blankLine) overlay.blankLine(state.overlay);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'>};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/override.css b/ipynb/Array-feature-overlap-05_files/override.css</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..117fb7c</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/override.css</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>/*This file contains any manual css for this page that needs to override the global styles.</span> <span class='diff-add'>This is only required when different pages style the same element differently. This is just</span> <span class='diff-add'>a hack to deal with our current css styles and no new styling should be added in this file.*/</span> <span class='diff-add'>#ipython-main-app {</span> <span class='diff-add'> position: relative;</span> <span class='diff-add'>}</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/page.js b/ipynb/Array-feature-overlap-05_files/page.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..ea35027</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/page.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/events',</span> <span class='diff-add'>], function(IPython, $, events){</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var Page = function () {</span> <span class='diff-add'> this.bind_events();</span> <span class='diff-add'> };</span> <span class='diff-add'> Page.prototype.bind_events = function () {</span> <span class='diff-add'> // resize site on:</span> <span class='diff-add'> // - window resize</span> <span class='diff-add'> // - header change</span> <span class='diff-add'> // - page load</span> <span class='diff-add'> var _handle_resize = $.proxy(this._resize_site, this);</span> <span class='diff-add'> </span> <span class='diff-add'> $(window).resize(_handle_resize);</span> <span class='diff-add'> // On document ready, resize codemirror.</span> <span class='diff-add'> $(document).ready(_handle_resize);</span> <span class='diff-add'> events.on('resize-header.Page', _handle_resize);</span> <span class='diff-add'> };</span> <span class='diff-add'> Page.prototype.show = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * The header and site divs start out hidden to prevent FLOUC.</span> <span class='diff-add'> * Main scripts should call this method after styling everything.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.show_header();</span> <span class='diff-add'> this.show_site();</span> <span class='diff-add'> };</span> <span class='diff-add'> Page.prototype.show_header = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * The header and site divs start out hidden to prevent FLOUC.</span> <span class='diff-add'> * Main scripts should call this method after styling everything.</span> <span class='diff-add'> * TODO: selector are hardcoded, pass as constructor argument</span> <span class='diff-add'> */</span> <span class='diff-add'> $('div#header').css('display','block');</span> <span class='diff-add'> };</span> <span class='diff-add'> Page.prototype.show_site = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * The header and site divs start out hidden to prevent FLOUC.</span> <span class='diff-add'> * Main scripts should call this method after styling everything.</span> <span class='diff-add'> * TODO: selector are hardcoded, pass as constructor argument</span> <span class='diff-add'> */</span> <span class='diff-add'> $('div#site').css('display', 'block');</span> <span class='diff-add'> this._resize_site();</span> <span class='diff-add'> };</span> <span class='diff-add'> Page.prototype._resize_site = function() {</span> <span class='diff-add'> // Update the site's size.</span> <span class='diff-add'> $('div#site').height(window.innerHeight - $('#header').height());</span> <span class='diff-add'> };</span> <span class='diff-add'> // Register self in the global namespace for convenience.</span> <span class='diff-add'> IPython.Page = Page;</span> <span class='diff-add'> return {'Page': Page};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/pager.js b/ipynb/Array-feature-overlap-05_files/pager.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..881d575</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/pager.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jqueryui',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'>], function(IPython, $, utils) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var Pager = function (pager_selector, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Constructor</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters:</span> <span class='diff-add'> * pager_selector: string</span> <span class='diff-add'> * options: dictionary</span> <span class='diff-add'> * Dictionary of keyword arguments.</span> <span class='diff-add'> * events: $(Events) instance</span> <span class='diff-add'> */</span> <span class='diff-add'> this.events = options.events;</span> <span class='diff-add'> this.pager_element = $(pager_selector);</span> <span class='diff-add'> this.pager_button_area = $('#pager-button-area');</span> <span class='diff-add'> this._default_end_space = 100;</span> <span class='diff-add'> this.pager_element.resizable({handles: 'n', resize: $.proxy(this._resize, this)});</span> <span class='diff-add'> this.expanded = false;</span> <span class='diff-add'> this.create_button_area();</span> <span class='diff-add'> this.bind_events();</span> <span class='diff-add'> };</span> <span class='diff-add'> Pager.prototype.create_button_area = function(){</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.pager_button_area.append(</span> <span class='diff-add'> $('<a>').attr('role', "button")</span> <span class='diff-add'> .attr('title',"Open the pager in an external window")</span> <span class='diff-add'> .addClass('ui-button')</span> <span class='diff-add'> .click(function(){that.detach();})</span> <span class='diff-add'> .append(</span> <span class='diff-add'> $('<span>').addClass("ui-icon ui-icon-extlink")</span> <span class='diff-add'> )</span> <span class='diff-add'> );</span> <span class='diff-add'> this.pager_button_area.append(</span> <span class='diff-add'> $('<a>').attr('role', "button")</span> <span class='diff-add'> .attr('title',"Close the pager")</span> <span class='diff-add'> .addClass('ui-button')</span> <span class='diff-add'> .click(function(){that.collapse();})</span> <span class='diff-add'> .append(</span> <span class='diff-add'> $('<span>').addClass("ui-icon ui-icon-close")</span> <span class='diff-add'> )</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> Pager.prototype.bind_events = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.pager_element.bind('collapse_pager', function (event, extrap) {</span> <span class='diff-add'> // Animate hiding of the pager.</span> <span class='diff-add'> var time = (extrap && extrap.duration) ? extrap.duration : 'fast';</span> <span class='diff-add'> that.pager_element.animate({</span> <span class='diff-add'> height: 'toggle'</span> <span class='diff-add'> }, {</span> <span class='diff-add'> duration: time,</span> <span class='diff-add'> done: function() {</span> <span class='diff-add'> $('.end_space').css('height', that._default_end_space);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> });</span> <span class='diff-add'> this.pager_element.bind('expand_pager', function (event, extrap) {</span> <span class='diff-add'> // Clear the pager's height attr if it's set. This allows the</span> <span class='diff-add'> // pager to size itself according to its contents.</span> <span class='diff-add'> that.pager_element.height('initial');</span> <span class='diff-add'> // Animate the showing of the pager</span> <span class='diff-add'> var time = (extrap && extrap.duration) ? extrap.duration : 'fast';</span> <span class='diff-add'> that.pager_element.show(time, function() {</span> <span class='diff-add'> // Explicitly set pager height once the pager has shown itself.</span> <span class='diff-add'> // This allows the pager-contents div to use percentage sizing.</span> <span class='diff-add'> that.pager_element.height(that.pager_element.height());</span> <span class='diff-add'> that._resize();</span> <span class='diff-add'> });</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('open_with_text.Pager', function (event, payload) {</span> <span class='diff-add'> // FIXME: support other mime types</span> <span class='diff-add'> if (payload.data['text/plain'] && payload.data['text/plain'] !== "") {</span> <span class='diff-add'> that.clear();</span> <span class='diff-add'> that.expand();</span> <span class='diff-add'> that.append_text(payload.data['text/plain']);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> Pager.prototype.collapse = function (extrap) {</span> <span class='diff-add'> if (this.expanded === true) {</span> <span class='diff-add'> this.expanded = false;</span> <span class='diff-add'> this.pager_element.trigger('collapse_pager', extrap);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> Pager.prototype.expand = function (extrap) {</span> <span class='diff-add'> if (this.expanded !== true) {</span> <span class='diff-add'> this.expanded = true;</span> <span class='diff-add'> this.pager_element.trigger('expand_pager', extrap);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> Pager.prototype.toggle = function () {</span> <span class='diff-add'> if (this.expanded === true) {</span> <span class='diff-add'> this.collapse();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.expand();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> Pager.prototype.clear = function (text) {</span> <span class='diff-add'> this.pager_element.find(".container").empty();</span> <span class='diff-add'> };</span> <span class='diff-add'> Pager.prototype.detach = function(){</span> <span class='diff-add'> var w = window.open("","_blank");</span> <span class='diff-add'> $(w.document.head)</span> <span class='diff-add'> .append(</span> <span class='diff-add'> $('<link>')</span> <span class='diff-add'> .attr('rel',"stylesheet")</span> <span class='diff-add'> .attr('href',"/static/css/notebook.css")</span> <span class='diff-add'> .attr('type',"text/css")</span> <span class='diff-add'> )</span> <span class='diff-add'> .append(</span> <span class='diff-add'> $('<title>').text("IPython Pager")</span> <span class='diff-add'> );</span> <span class='diff-add'> var pager_body = $(w.document.body);</span> <span class='diff-add'> pager_body.css('overflow','scroll');</span> <span class='diff-add'> pager_body.append(this.pager_element.clone().children());</span> <span class='diff-add'> w.document.close();</span> <span class='diff-add'> this.collapse();</span> <span class='diff-add'> };</span> <span class='diff-add'> Pager.prototype.append_text = function (text) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * The only user content injected with this HTML call is escaped by</span> <span class='diff-add'> * the fixConsole() method.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.pager_element.find(".container").append($('<pre/>').html(utils.fixCarriageReturn(utils.fixConsole(text))));</span> <span class='diff-add'> };</span> <span class='diff-add'> Pager.prototype._resize = function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update document based on pager size.</span> <span class='diff-add'> */</span> <span class='diff-add'> </span> <span class='diff-add'> // Make sure the padding at the end of the notebook is large</span> <span class='diff-add'> // enough that the user can scroll to the bottom of the </span> <span class='diff-add'> // notebook.</span> <span class='diff-add'> $('.end_space').css('height', Math.max(this.pager_element.height(), this._default_end_space));</span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatability.</span> <span class='diff-add'> IPython.Pager = Pager;</span> <span class='diff-add'> return {'Pager': Pager};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/promise.min.js b/ipynb/Array-feature-overlap-05_files/promise.min.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..8c87983</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/promise.min.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>!function(){var a,b,c,d;!function(){var e={},f={};a=function(a,b,c){e[a]={deps:b,callback:c}},d=c=b=function(a){function c(b){if("."!==b.charAt(0))return b;for(var c=b.split("/"),d=a.split("/").slice(0,-1),e=0,f=c.length;f>e;e++){var g=c[e];if(".."===g)d.pop();else{if("."===g)continue;d.push(g)}}return d.join("/")}if(d._eak_seen=e,f[a])return f[a];if(f[a]={},!e[a])throw new Error("Could not find module "+a);for(var g,h=e[a],i=h.deps,j=h.callback,k=[],l=0,m=i.length;m>l;l++)"exports"===i[l]?k.push(g={}):k.push(b(c(i[l])));var n=j.apply(this,k);return f[a]=g||n}}(),a("promise/all",["./utils","exports"],function(a,b){"use strict";function c(a){var b=this;if(!d(a))throw new TypeError("You must pass an array to all.");return new b(function(b,c){function d(a){return function(b){f(a,b)}}function f(a,c){h[a]=c,0===--i&&b(h)}var g,h=[],i=a.length;0===i&&b([]);for(var j=0;j<a.length;j++)g=a[j],g&&e(g.then)?g.then(d(j),c):f(j,g)})}var d=a.isArray,e=a.isFunction;b.all=c}),a("promise/asap",["exports"],function(a){"use strict";function b(){return function(){process.nextTick(e)}}function c(){var a=0,b=new i(e),c=document.createTextNode("");return b.observe(c,{characterData:!0}),function(){c.data=a=++a%2}}function d(){return function(){j.setTimeout(e,1)}}function e(){for(var a=0;a<k.length;a++){var b=k[a],c=b[0],d=b[1];c(d)}k=[]}function f(a,b){var c=k.push([a,b]);1===c&&g()}var g,h="undefined"!=typeof window?window:{},i=h.MutationObserver||h.WebKitMutationObserver,j="undefined"!=typeof global?global:void 0===this?window:this,k=[];g="undefined"!=typeof process&&"[object process]"==={}.toString.call(process)?b():i?c():d(),a.asap=f}),a("promise/config",["exports"],function(a){"use strict";function b(a,b){return 2!==arguments.length?c[a]:(c[a]=b,void 0)}var c={instrument:!1};a.config=c,a.configure=b}),a("promise/polyfill",["./promise","./utils","exports"],function(a,b,c){"use strict";function d(){var a;a="undefined"!=typeof global?global:"undefined"!=typeof window&&window.document?window:self;var b="Promise"in a&&"resolve"in a.Promise&&"reject"in a.Promise&&"all"in a.Promise&&"race"in a.Promise&&function(){var b;return new a.Promise(function(a){b=a}),f(b)}();b||(a.Promise=e)}var e=a.Promise,f=b.isFunction;c.polyfill=d}),a("promise/promise",["./config","./utils","./all","./race","./resolve","./reject","./asap","exports"],function(a,b,c,d,e,f,g,h){"use strict";function i(a){if(!v(a))throw new TypeError("You must pass a resolver function as the first argument to the promise constructor");if(!(this instanceof i))throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");this._subscribers=[],j(a,this)}function j(a,b){function c(a){o(b,a)}function d(a){q(b,a)}try{a(c,d)}catch(e){d(e)}}function k(a,b,c,d){var e,f,g,h,i=v(c);if(i)try{e=c(d),g=!0}catch(j){h=!0,f=j}else e=d,g=!0;n(b,e)||(i&&g?o(b,e):h?q(b,f):a===D?o(b,e):a===E&&q(b,e))}function l(a,b,c,d){var e=a._subscribers,f=e.length;e[f]=b,e[f+D]=c,e[f+E]=d}function m(a,b){for(var c,d,e=a._subscribers,f=a._detail,g=0;g<e.length;g+=3)c=e[g],d=e[g+b],k(b,c,d,f);a._subscribers=null}function n(a,b){var c,d=null;try{if(a===b)throw new TypeError("A promises callback cannot return that same promise.");if(u(b)&&(d=b.then,v(d)))return d.call(b,function(d){return c?!0:(c=!0,b!==d?o(a,d):p(a,d),void 0)},function(b){return c?!0:(c=!0,q(a,b),void 0)}),!0}catch(e){return c?!0:(q(a,e),!0)}return!1}function o(a,b){a===b?p(a,b):n(a,b)||p(a,b)}function p(a,b){a._state===B&&(a._state=C,a._detail=b,t.async(r,a))}function q(a,b){a._state===B&&(a._state=C,a._detail=b,t.async(s,a))}function r(a){m(a,a._state=D)}function s(a){m(a,a._state=E)}var t=a.config,u=(a.configure,b.objectOrFunction),v=b.isFunction,w=(b.now,c.all),x=d.race,y=e.resolve,z=f.reject,A=g.asap;t.async=A;var B=void 0,C=0,D=1,E=2;i.prototype={constructor:i,_state:void 0,_detail:void 0,_subscribers:void 0,then:function(a,b){var c=this,d=new this.constructor(function(){});if(this._state){var e=arguments;t.async(function(){k(c._state,d,e[c._state-1],c._detail)})}else l(this,d,a,b);return d},"catch":function(a){return this.then(null,a)}},i.all=w,i.race=x,i.resolve=y,i.reject=z,h.Promise=i}),a("promise/race",["./utils","exports"],function(a,b){"use strict";function c(a){var b=this;if(!d(a))throw new TypeError("You must pass an array to race.");return new b(function(b,c){for(var d,e=0;e<a.length;e++)d=a[e],d&&"function"==typeof d.then?d.then(b,c):b(d)})}var d=a.isArray;b.race=c}),a("promise/reject",["exports"],function(a){"use strict";function b(a){var b=this;return new b(function(b,c){c(a)})}a.reject=b}),a("promise/resolve",["exports"],function(a){"use strict";function b(a){if(a&&"object"==typeof a&&a.constructor===this)return a;var b=this;return new b(function(b){b(a)})}a.resolve=b}),a("promise/utils",["exports"],function(a){"use strict";function b(a){return c(a)||"object"==typeof a&&null!==a}function c(a){return"function"==typeof a}function d(a){return"[object Array]"===Object.prototype.toString.call(a)}var e=Date.now||function(){return(new Date).getTime()};a.objectOrFunction=b,a.isFunction=c,a.isArray=d,a.now=e}),b("promise/polyfill").polyfill()}();</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/python.js b/ipynb/Array-feature-overlap-05_files/python.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..98c0409</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/python.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span> <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span> <span class='diff-add'>(function(mod) {</span> <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span> <span class='diff-add'> mod(require("../../lib/codemirror"));</span> <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span> <span class='diff-add'> define(["../../lib/codemirror"], mod);</span> <span class='diff-add'> else // Plain browser env</span> <span class='diff-add'> mod(CodeMirror);</span> <span class='diff-add'>})(function(CodeMirror) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> function wordRegexp(words) {</span> <span class='diff-add'> return new RegExp("^((" + words.join(")|(") + "))\\b");</span> <span class='diff-add'> }</span> <span class='diff-add'> var wordOperators = wordRegexp(["and", "or", "not", "is"]);</span> <span class='diff-add'> var commonKeywords = ["as", "assert", "break", "class", "continue",</span> <span class='diff-add'> "def", "del", "elif", "else", "except", "finally",</span> <span class='diff-add'> "for", "from", "global", "if", "import",</span> <span class='diff-add'> "lambda", "pass", "raise", "return",</span> <span class='diff-add'> "try", "while", "with", "yield", "in"];</span> <span class='diff-add'> var commonBuiltins = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr",</span> <span class='diff-add'> "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod",</span> <span class='diff-add'> "enumerate", "eval", "filter", "float", "format", "frozenset",</span> <span class='diff-add'> "getattr", "globals", "hasattr", "hash", "help", "hex", "id",</span> <span class='diff-add'> "input", "int", "isinstance", "issubclass", "iter", "len",</span> <span class='diff-add'> "list", "locals", "map", "max", "memoryview", "min", "next",</span> <span class='diff-add'> "object", "oct", "open", "ord", "pow", "property", "range",</span> <span class='diff-add'> "repr", "reversed", "round", "set", "setattr", "slice",</span> <span class='diff-add'> "sorted", "staticmethod", "str", "sum", "super", "tuple",</span> <span class='diff-add'> "type", "vars", "zip", "__import__", "NotImplemented",</span> <span class='diff-add'> "Ellipsis", "__debug__"];</span> <span class='diff-add'> var py2 = {builtins: ["apply", "basestring", "buffer", "cmp", "coerce", "execfile",</span> <span class='diff-add'> "file", "intern", "long", "raw_input", "reduce", "reload",</span> <span class='diff-add'> "unichr", "unicode", "xrange", "False", "True", "None"],</span> <span class='diff-add'> keywords: ["exec", "print"]};</span> <span class='diff-add'> var py3 = {builtins: ["ascii", "bytes", "exec", "print"],</span> <span class='diff-add'> keywords: ["nonlocal", "False", "True", "None"]};</span> <span class='diff-add'> CodeMirror.registerHelper("hintWords", "python", commonKeywords.concat(commonBuiltins));</span> <span class='diff-add'> function top(state) {</span> <span class='diff-add'> return state.scopes[state.scopes.length - 1];</span> <span class='diff-add'> }</span> <span class='diff-add'> CodeMirror.defineMode("python", function(conf, parserConf) {</span> <span class='diff-add'> var ERRORCLASS = "error";</span> <span class='diff-add'> var singleDelimiters = parserConf.singleDelimiters || new RegExp("^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]");</span> <span class='diff-add'> var doubleOperators = parserConf.doubleOperators || new RegExp("^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))");</span> <span class='diff-add'> var doubleDelimiters = parserConf.doubleDelimiters || new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))");</span> <span class='diff-add'> var tripleDelimiters = parserConf.tripleDelimiters || new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))");</span> <span class='diff-add'> if (parserConf.version && parseInt(parserConf.version, 10) == 3){</span> <span class='diff-add'> // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator</span> <span class='diff-add'> var singleOperators = parserConf.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!@]");</span> <span class='diff-add'> var identifiers = parserConf.identifiers|| new RegExp("^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*");</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var singleOperators = parserConf.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!]");</span> <span class='diff-add'> var identifiers = parserConf.identifiers|| new RegExp("^[_A-Za-z][_A-Za-z0-9]*");</span> <span class='diff-add'> }</span> <span class='diff-add'> var hangingIndent = parserConf.hangingIndent || conf.indentUnit;</span> <span class='diff-add'> var myKeywords = commonKeywords, myBuiltins = commonBuiltins;</span> <span class='diff-add'> if(parserConf.extra_keywords != undefined){</span> <span class='diff-add'> myKeywords = myKeywords.concat(parserConf.extra_keywords);</span> <span class='diff-add'> }</span> <span class='diff-add'> if(parserConf.extra_builtins != undefined){</span> <span class='diff-add'> myBuiltins = myBuiltins.concat(parserConf.extra_builtins);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (parserConf.version && parseInt(parserConf.version, 10) == 3) {</span> <span class='diff-add'> myKeywords = myKeywords.concat(py3.keywords);</span> <span class='diff-add'> myBuiltins = myBuiltins.concat(py3.builtins);</span> <span class='diff-add'> var stringPrefixes = new RegExp("^(([rb]|(br))?('{3}|\"{3}|['\"]))", "i");</span> <span class='diff-add'> } else {</span> <span class='diff-add'> myKeywords = myKeywords.concat(py2.keywords);</span> <span class='diff-add'> myBuiltins = myBuiltins.concat(py2.builtins);</span> <span class='diff-add'> var stringPrefixes = new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i");</span> <span class='diff-add'> }</span> <span class='diff-add'> var keywords = wordRegexp(myKeywords);</span> <span class='diff-add'> var builtins = wordRegexp(myBuiltins);</span> <span class='diff-add'> // tokenizers</span> <span class='diff-add'> function tokenBase(stream, state) {</span> <span class='diff-add'> // Handle scope changes</span> <span class='diff-add'> if (stream.sol() && top(state).type == "py") {</span> <span class='diff-add'> var scopeOffset = top(state).offset;</span> <span class='diff-add'> if (stream.eatSpace()) {</span> <span class='diff-add'> var lineOffset = stream.indentation();</span> <span class='diff-add'> if (lineOffset > scopeOffset)</span> <span class='diff-add'> pushScope(stream, state, "py");</span> <span class='diff-add'> else if (lineOffset < scopeOffset && dedent(stream, state))</span> <span class='diff-add'> state.errorToken = true;</span> <span class='diff-add'> return null;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var style = tokenBaseInner(stream, state);</span> <span class='diff-add'> if (scopeOffset > 0 && dedent(stream, state))</span> <span class='diff-add'> style += " " + ERRORCLASS;</span> <span class='diff-add'> return style;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return tokenBaseInner(stream, state);</span> <span class='diff-add'> }</span> <span class='diff-add'> function tokenBaseInner(stream, state) {</span> <span class='diff-add'> if (stream.eatSpace()) return null;</span> <span class='diff-add'> var ch = stream.peek();</span> <span class='diff-add'> // Handle Comments</span> <span class='diff-add'> if (ch == "#") {</span> <span class='diff-add'> stream.skipToEnd();</span> <span class='diff-add'> return "comment";</span> <span class='diff-add'> }</span> <span class='diff-add'> // Handle Number Literals</span> <span class='diff-add'> if (stream.match(/^[0-9\.]/, false)) {</span> <span class='diff-add'> var floatLiteral = false;</span> <span class='diff-add'> // Floats</span> <span class='diff-add'> if (stream.match(/^\d*\.\d+(e[\+\-]?\d+)?/i)) { floatLiteral = true; }</span> <span class='diff-add'> if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; }</span> <span class='diff-add'> if (stream.match(/^\.\d+/)) { floatLiteral = true; }</span> <span class='diff-add'> if (floatLiteral) {</span> <span class='diff-add'> // Float literals may be "imaginary"</span> <span class='diff-add'> stream.eat(/J/i);</span> <span class='diff-add'> return "number";</span> <span class='diff-add'> }</span> <span class='diff-add'> // Integers</span> <span class='diff-add'> var intLiteral = false;</span> <span class='diff-add'> // Hex</span> <span class='diff-add'> if (stream.match(/^0x[0-9a-f]+/i)) intLiteral = true;</span> <span class='diff-add'> // Binary</span> <span class='diff-add'> if (stream.match(/^0b[01]+/i)) intLiteral = true;</span> <span class='diff-add'> // Octal</span> <span class='diff-add'> if (stream.match(/^0o[0-7]+/i)) intLiteral = true;</span> <span class='diff-add'> // Decimal</span> <span class='diff-add'> if (stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)) {</span> <span class='diff-add'> // Decimal literals may be "imaginary"</span> <span class='diff-add'> stream.eat(/J/i);</span> <span class='diff-add'> // TODO - Can you have imaginary longs?</span> <span class='diff-add'> intLiteral = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Zero by itself with no other piece of number.</span> <span class='diff-add'> if (stream.match(/^0(?![\dx])/i)) intLiteral = true;</span> <span class='diff-add'> if (intLiteral) {</span> <span class='diff-add'> // Integer literals may be "long"</span> <span class='diff-add'> stream.eat(/L/i);</span> <span class='diff-add'> return "number";</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Handle Strings</span> <span class='diff-add'> if (stream.match(stringPrefixes)) {</span> <span class='diff-add'> state.tokenize = tokenStringFactory(stream.current());</span> <span class='diff-add'> return state.tokenize(stream, state);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Handle operators and Delimiters</span> <span class='diff-add'> if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters))</span> <span class='diff-add'> return null;</span> <span class='diff-add'> if (stream.match(doubleOperators)</span> <span class='diff-add'> || stream.match(singleOperators)</span> <span class='diff-add'> || stream.match(wordOperators))</span> <span class='diff-add'> return "operator";</span> <span class='diff-add'> if (stream.match(singleDelimiters))</span> <span class='diff-add'> return null;</span> <span class='diff-add'> if (stream.match(keywords))</span> <span class='diff-add'> return "keyword";</span> <span class='diff-add'> if (stream.match(builtins))</span> <span class='diff-add'> return "builtin";</span> <span class='diff-add'> if (stream.match(/^(self|cls)\b/))</span> <span class='diff-add'> return "variable-2";</span> <span class='diff-add'> if (stream.match(identifiers)) {</span> <span class='diff-add'> if (state.lastToken == "def" || state.lastToken == "class")</span> <span class='diff-add'> return "def";</span> <span class='diff-add'> return "variable";</span> <span class='diff-add'> }</span> <span class='diff-add'> // Handle non-detected items</span> <span class='diff-add'> stream.next();</span> <span class='diff-add'> return ERRORCLASS;</span> <span class='diff-add'> }</span> <span class='diff-add'> function tokenStringFactory(delimiter) {</span> <span class='diff-add'> while ("rub".indexOf(delimiter.charAt(0).toLowerCase()) >= 0)</span> <span class='diff-add'> delimiter = delimiter.substr(1);</span> <span class='diff-add'> var singleline = delimiter.length == 1;</span> <span class='diff-add'> var OUTCLASS = "string";</span> <span class='diff-add'> function tokenString(stream, state) {</span> <span class='diff-add'> while (!stream.eol()) {</span> <span class='diff-add'> stream.eatWhile(/[^'"\\]/);</span> <span class='diff-add'> if (stream.eat("\\")) {</span> <span class='diff-add'> stream.next();</span> <span class='diff-add'> if (singleline && stream.eol())</span> <span class='diff-add'> return OUTCLASS;</span> <span class='diff-add'> } else if (stream.match(delimiter)) {</span> <span class='diff-add'> state.tokenize = tokenBase;</span> <span class='diff-add'> return OUTCLASS;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> stream.eat(/['"]/);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (singleline) {</span> <span class='diff-add'> if (parserConf.singleLineStringErrors)</span> <span class='diff-add'> return ERRORCLASS;</span> <span class='diff-add'> else</span> <span class='diff-add'> state.tokenize = tokenBase;</span> <span class='diff-add'> }</span> <span class='diff-add'> return OUTCLASS;</span> <span class='diff-add'> }</span> <span class='diff-add'> tokenString.isString = true;</span> <span class='diff-add'> return tokenString;</span> <span class='diff-add'> }</span> <span class='diff-add'> function pushScope(stream, state, type) {</span> <span class='diff-add'> var offset = 0, align = null;</span> <span class='diff-add'> if (type == "py") {</span> <span class='diff-add'> while (top(state).type != "py")</span> <span class='diff-add'> state.scopes.pop();</span> <span class='diff-add'> }</span> <span class='diff-add'> offset = top(state).offset + (type == "py" ? conf.indentUnit : hangingIndent);</span> <span class='diff-add'> if (type != "py" && !stream.match(/^(\s|#.*)*$/, false))</span> <span class='diff-add'> align = stream.column() + 1;</span> <span class='diff-add'> state.scopes.push({offset: offset, type: type, align: align});</span> <span class='diff-add'> }</span> <span class='diff-add'> function dedent(stream, state) {</span> <span class='diff-add'> var indented = stream.indentation();</span> <span class='diff-add'> while (top(state).offset > indented) {</span> <span class='diff-add'> if (top(state).type != "py") return true;</span> <span class='diff-add'> state.scopes.pop();</span> <span class='diff-add'> }</span> <span class='diff-add'> return top(state).offset != indented;</span> <span class='diff-add'> }</span> <span class='diff-add'> function tokenLexer(stream, state) {</span> <span class='diff-add'> var style = state.tokenize(stream, state);</span> <span class='diff-add'> var current = stream.current();</span> <span class='diff-add'> // Handle '.' connected identifiers</span> <span class='diff-add'> if (current == ".") {</span> <span class='diff-add'> style = stream.match(identifiers, false) ? null : ERRORCLASS;</span> <span class='diff-add'> if (style == null && state.lastStyle == "meta") {</span> <span class='diff-add'> // Apply 'meta' style to '.' connected identifiers when</span> <span class='diff-add'> // appropriate.</span> <span class='diff-add'> style = "meta";</span> <span class='diff-add'> }</span> <span class='diff-add'> return style;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Handle decorators</span> <span class='diff-add'> if (current == "@"){</span> <span class='diff-add'> if(parserConf.version && parseInt(parserConf.version, 10) == 3){</span> <span class='diff-add'> return stream.match(identifiers, false) ? "meta" : "operator";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return stream.match(identifiers, false) ? "meta" : ERRORCLASS;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if ((style == "variable" || style == "builtin")</span> <span class='diff-add'> && state.lastStyle == "meta")</span> <span class='diff-add'> style = "meta";</span> <span class='diff-add'> // Handle scope changes.</span> <span class='diff-add'> if (current == "pass" || current == "return")</span> <span class='diff-add'> state.dedent += 1;</span> <span class='diff-add'> if (current == "lambda") state.lambda = true;</span> <span class='diff-add'> if (current == ":" && !state.lambda && top(state).type == "py")</span> <span class='diff-add'> pushScope(stream, state, "py");</span> <span class='diff-add'> var delimiter_index = current.length == 1 ? "[({".indexOf(current) : -1;</span> <span class='diff-add'> if (delimiter_index != -1)</span> <span class='diff-add'> pushScope(stream, state, "])}".slice(delimiter_index, delimiter_index+1));</span> <span class='diff-add'> delimiter_index = "])}".indexOf(current);</span> <span class='diff-add'> if (delimiter_index != -1) {</span> <span class='diff-add'> if (top(state).type == current) state.scopes.pop();</span> <span class='diff-add'> else return ERRORCLASS;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (state.dedent > 0 && stream.eol() && top(state).type == "py") {</span> <span class='diff-add'> if (state.scopes.length > 1) state.scopes.pop();</span> <span class='diff-add'> state.dedent -= 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> return style;</span> <span class='diff-add'> }</span> <span class='diff-add'> var external = {</span> <span class='diff-add'> startState: function(basecolumn) {</span> <span class='diff-add'> return {</span> <span class='diff-add'> tokenize: tokenBase,</span> <span class='diff-add'> scopes: [{offset: basecolumn || 0, type: "py", align: null}],</span> <span class='diff-add'> lastStyle: null,</span> <span class='diff-add'> lastToken: null,</span> <span class='diff-add'> lambda: false,</span> <span class='diff-add'> dedent: 0</span> <span class='diff-add'> };</span> <span class='diff-add'> },</span> <span class='diff-add'> token: function(stream, state) {</span> <span class='diff-add'> var addErr = state.errorToken;</span> <span class='diff-add'> if (addErr) state.errorToken = false;</span> <span class='diff-add'> var style = tokenLexer(stream, state);</span> <span class='diff-add'> state.lastStyle = style;</span> <span class='diff-add'> var current = stream.current();</span> <span class='diff-add'> if (current && style)</span> <span class='diff-add'> state.lastToken = current;</span> <span class='diff-add'> if (stream.eol() && state.lambda)</span> <span class='diff-add'> state.lambda = false;</span> <span class='diff-add'> return addErr ? style + " " + ERRORCLASS : style;</span> <span class='diff-add'> },</span> <span class='diff-add'> indent: function(state, textAfter) {</span> <span class='diff-add'> if (state.tokenize != tokenBase)</span> <span class='diff-add'> return state.tokenize.isString ? CodeMirror.Pass : 0;</span> <span class='diff-add'> var scope = top(state);</span> <span class='diff-add'> var closing = textAfter && textAfter.charAt(0) == scope.type;</span> <span class='diff-add'> if (scope.align != null)</span> <span class='diff-add'> return scope.align - (closing ? 1 : 0);</span> <span class='diff-add'> else if (closing && state.scopes.length > 1)</span> <span class='diff-add'> return state.scopes[state.scopes.length - 2].offset;</span> <span class='diff-add'> else</span> <span class='diff-add'> return scope.offset;</span> <span class='diff-add'> },</span> <span class='diff-add'> lineComment: "#",</span> <span class='diff-add'> fold: "indent"</span> <span class='diff-add'> };</span> <span class='diff-add'> return external;</span> <span class='diff-add'> });</span> <span class='diff-add'> CodeMirror.defineMIME("text/x-python", "python");</span> <span class='diff-add'> var words = function(str) { return str.split(" "); };</span> <span class='diff-add'> CodeMirror.defineMIME("text/x-cython", {</span> <span class='diff-add'> name: "python",</span> <span class='diff-add'> extra_keywords: words("by cdef cimport cpdef ctypedef enum except"+</span> <span class='diff-add'> "extern gil include nogil property public"+</span> <span class='diff-add'> "readonly struct union DEF IF ELIF ELSE")</span> <span class='diff-add'> });</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/quickhelp.js b/ipynb/Array-feature-overlap-05_files/quickhelp.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..3640213</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/quickhelp.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> 'base/js/dialog',</span> <span class='diff-add'>], function(IPython, $, utils, dialog) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var platform = utils.platform;</span> <span class='diff-add'> var QuickHelp = function (options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Constructor</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters:</span> <span class='diff-add'> * options: dictionary</span> <span class='diff-add'> * Dictionary of keyword arguments.</span> <span class='diff-add'> * events: $(Events) instance</span> <span class='diff-add'> * keyboard_manager: KeyboardManager instance</span> <span class='diff-add'> * notebook: Notebook instance</span> <span class='diff-add'> */</span> <span class='diff-add'> this.keyboard_manager = options.keyboard_manager;</span> <span class='diff-add'> this.notebook = options.notebook;</span> <span class='diff-add'> this.keyboard_manager.quick_help = this;</span> <span class='diff-add'> this.events = options.events;</span> <span class='diff-add'> };</span> <span class='diff-add'> var cmd_ctrl = 'Ctrl-';</span> <span class='diff-add'> var platform_specific;</span> <span class='diff-add'> if (platform === 'MacOS') {</span> <span class='diff-add'> // Mac OS X specific</span> <span class='diff-add'> cmd_ctrl = 'Cmd-';</span> <span class='diff-add'> platform_specific = [</span> <span class='diff-add'> { shortcut: "Cmd-Up", help:"go to cell start" },</span> <span class='diff-add'> { shortcut: "Cmd-Down", help:"go to cell end" },</span> <span class='diff-add'> { shortcut: "Alt-Left", help:"go one word left" },</span> <span class='diff-add'> { shortcut: "Alt-Right", help:"go one word right" },</span> <span class='diff-add'> { shortcut: "Alt-Backspace", help:"delete word before" },</span> <span class='diff-add'> { shortcut: "Alt-Delete", help:"delete word after" },</span> <span class='diff-add'> ];</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // PC specific</span> <span class='diff-add'> platform_specific = [</span> <span class='diff-add'> { shortcut: "Ctrl-Home", help:"go to cell start" },</span> <span class='diff-add'> { shortcut: "Ctrl-Up", help:"go to cell start" },</span> <span class='diff-add'> { shortcut: "Ctrl-End", help:"go to cell end" },</span> <span class='diff-add'> { shortcut: "Ctrl-Down", help:"go to cell end" },</span> <span class='diff-add'> { shortcut: "Ctrl-Left", help:"go one word left" },</span> <span class='diff-add'> { shortcut: "Ctrl-Right", help:"go one word right" },</span> <span class='diff-add'> { shortcut: "Ctrl-Backspace", help:"delete word before" },</span> <span class='diff-add'> { shortcut: "Ctrl-Delete", help:"delete word after" },</span> <span class='diff-add'> ];</span> <span class='diff-add'> }</span> <span class='diff-add'> var cm_shortcuts = [</span> <span class='diff-add'> { shortcut:"Tab", help:"code completion or indent" },</span> <span class='diff-add'> { shortcut:"Shift-Tab", help:"tooltip" },</span> <span class='diff-add'> { shortcut: cmd_ctrl + "]", help:"indent" },</span> <span class='diff-add'> { shortcut: cmd_ctrl + "[", help:"dedent" },</span> <span class='diff-add'> { shortcut: cmd_ctrl + "a", help:"select all" },</span> <span class='diff-add'> { shortcut: cmd_ctrl + "z", help:"undo" },</span> <span class='diff-add'> { shortcut: cmd_ctrl + "Shift-z", help:"redo" },</span> <span class='diff-add'> { shortcut: cmd_ctrl + "y", help:"redo" },</span> <span class='diff-add'> ].concat( platform_specific );</span> <span class='diff-add'> </span> <span class='diff-add'> var mac_humanize_map = {</span> <span class='diff-add'> // all these are unicode, will probably display badly on anything except macs.</span> <span class='diff-add'> // these are the standard symbol that are used in MacOS native menus</span> <span class='diff-add'> // cf http://apple.stackexchange.com/questions/55727/</span> <span class='diff-add'> // for htmlentities and/or unicode value</span> <span class='diff-add'> 'cmd':'⌘',</span> <span class='diff-add'> 'shift':'⇧',</span> <span class='diff-add'> 'alt':'⌥',</span> <span class='diff-add'> 'up':'↑',</span> <span class='diff-add'> 'down':'↓',</span> <span class='diff-add'> 'left':'←',</span> <span class='diff-add'> 'right':'→',</span> <span class='diff-add'> 'eject':'⏏',</span> <span class='diff-add'> 'tab':'⇥',</span> <span class='diff-add'> 'backtab':'⇤',</span> <span class='diff-add'> 'capslock':'⇪',</span> <span class='diff-add'> 'esc':'esc',</span> <span class='diff-add'> 'ctrl':'⌃',</span> <span class='diff-add'> 'enter':'↩',</span> <span class='diff-add'> 'pageup':'⇞',</span> <span class='diff-add'> 'pagedown':'⇟',</span> <span class='diff-add'> 'home':'↖',</span> <span class='diff-add'> 'end':'↘',</span> <span class='diff-add'> 'altenter':'⌤',</span> <span class='diff-add'> 'space':'␣',</span> <span class='diff-add'> 'delete':'⌦',</span> <span class='diff-add'> 'backspace':'⌫',</span> <span class='diff-add'> 'apple':'',</span> <span class='diff-add'> };</span> <span class='diff-add'> var default_humanize_map = {</span> <span class='diff-add'> 'shift':'Shift',</span> <span class='diff-add'> 'alt':'Alt',</span> <span class='diff-add'> 'up':'Up',</span> <span class='diff-add'> 'down':'Down',</span> <span class='diff-add'> 'left':'Left',</span> <span class='diff-add'> 'right':'Right',</span> <span class='diff-add'> 'tab':'Tab',</span> <span class='diff-add'> 'capslock':'Caps Lock',</span> <span class='diff-add'> 'esc':'Esc',</span> <span class='diff-add'> 'ctrl':'Ctrl',</span> <span class='diff-add'> 'enter':'Enter',</span> <span class='diff-add'> 'pageup':'Page Up',</span> <span class='diff-add'> 'pagedown':'Page Down',</span> <span class='diff-add'> 'home':'Home',</span> <span class='diff-add'> 'end':'End',</span> <span class='diff-add'> 'space':'Space',</span> <span class='diff-add'> 'backspace':'Backspace',</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var humanize_map;</span> <span class='diff-add'> if (platform === 'MacOS'){</span> <span class='diff-add'> humanize_map = mac_humanize_map;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> humanize_map = default_humanize_map;</span> <span class='diff-add'> }</span> <span class='diff-add'> function humanize_key(key){</span> <span class='diff-add'> if (key.length === 1){</span> <span class='diff-add'> key = key.toUpperCase();</span> <span class='diff-add'> }</span> <span class='diff-add'> return humanize_map[key.toLowerCase()]||key;</span> <span class='diff-add'> }</span> <span class='diff-add'> function humanize_sequence(sequence){</span> <span class='diff-add'> var joinchar = ',';</span> <span class='diff-add'> var hum = _.map(sequence.replace(/meta/g, 'cmd').split(','), humanize_shortcut).join(joinchar);</span> <span class='diff-add'> return hum;</span> <span class='diff-add'> }</span> <span class='diff-add'> function humanize_shortcut(shortcut){</span> <span class='diff-add'> var joinchar = '-';</span> <span class='diff-add'> if (platform === 'MacOS'){</span> <span class='diff-add'> joinchar = '';</span> <span class='diff-add'> }</span> <span class='diff-add'> var sh = _.map(shortcut.split('-'), humanize_key ).join(joinchar);</span> <span class='diff-add'> return sh;</span> <span class='diff-add'> }</span> <span class='diff-add'> QuickHelp.prototype.show_keyboard_shortcuts = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * toggles display of keyboard shortcut dialog</span> <span class='diff-add'> */</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> if ( this.force_rebuild ) {</span> <span class='diff-add'> this.shortcut_dialog.remove();</span> <span class='diff-add'> delete(this.shortcut_dialog);</span> <span class='diff-add'> this.force_rebuild = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> if ( this.shortcut_dialog ){</span> <span class='diff-add'> // if dialog is already shown, close it</span> <span class='diff-add'> $(this.shortcut_dialog).modal("toggle");</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var command_shortcuts = this.keyboard_manager.command_shortcuts.help();</span> <span class='diff-add'> var edit_shortcuts = this.keyboard_manager.edit_shortcuts.help();</span> <span class='diff-add'> var help, shortcut;</span> <span class='diff-add'> var i, half, n;</span> <span class='diff-add'> var element = $('<div/>');</span> <span class='diff-add'> // The documentation</span> <span class='diff-add'> var doc = $('<div/>').addClass('alert alert-warning');</span> <span class='diff-add'> doc.append(</span> <span class='diff-add'> $('<button/>').addClass('close').attr('data-dismiss','alert').html('×')</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> 'The IPython Notebook has two different keyboard input modes. <b>Edit mode</b> '+</span> <span class='diff-add'> 'allows you to type code/text into a cell and is indicated by a green cell '+</span> <span class='diff-add'> 'border. <b>Command mode</b> binds the keyboard to notebook level actions '+</span> <span class='diff-add'> 'and is indicated by a grey cell border.'</span> <span class='diff-add'> );</span> <span class='diff-add'> if (platform === 'MacOS') {</span> <span class='diff-add'> var key_div = this.build_key_names();</span> <span class='diff-add'> doc.append(key_div);</span> <span class='diff-add'> }</span> <span class='diff-add'> element.append(doc);</span> <span class='diff-add'> // Command mode</span> <span class='diff-add'> var cmd_div = this.build_command_help();</span> <span class='diff-add'> element.append(cmd_div);</span> <span class='diff-add'> // Edit mode</span> <span class='diff-add'> var edit_div = this.build_edit_help(cm_shortcuts);</span> <span class='diff-add'> element.append(edit_div);</span> <span class='diff-add'> this.shortcut_dialog = dialog.modal({</span> <span class='diff-add'> title : "Keyboard shortcuts",</span> <span class='diff-add'> body : element,</span> <span class='diff-add'> destroy : false,</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> Close : {}</span> <span class='diff-add'> },</span> <span class='diff-add'> notebook: this.notebook,</span> <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span> <span class='diff-add'> });</span> <span class='diff-add'> this.shortcut_dialog.addClass("modal_stretch");</span> <span class='diff-add'> </span> <span class='diff-add'> this.events.on('rebuild.QuickHelp', function() { that.force_rebuild = true;});</span> <span class='diff-add'> };</span> <span class='diff-add'> QuickHelp.prototype.build_key_names = function () {</span> <span class='diff-add'> var key_names_mac = [{ shortcut:"⌘", help:"Command" },</span> <span class='diff-add'> { shortcut:"⌃", help:"Control" },</span> <span class='diff-add'> { shortcut:"⌥", help:"Option" },</span> <span class='diff-add'> { shortcut:"⇧", help:"Shift" },</span> <span class='diff-add'> { shortcut:"↩", help:"Return" },</span> <span class='diff-add'> { shortcut:"␣", help:"Space" },</span> <span class='diff-add'> { shortcut:"⇥", help:"Tab" }];</span> <span class='diff-add'> var i, half, n;</span> <span class='diff-add'> var div = $('<div/>').append('MacOS modifier keys:');</span> <span class='diff-add'> var sub_div = $('<div/>').addClass('container-fluid');</span> <span class='diff-add'> var col1 = $('<div/>').addClass('col-md-6');</span> <span class='diff-add'> var col2 = $('<div/>').addClass('col-md-6');</span> <span class='diff-add'> n = key_names_mac.length;</span> <span class='diff-add'> half = ~~(n/2); </span> <span class='diff-add'> for (i=0; i<half; i++) { col1.append( </span> <span class='diff-add'> build_one(key_names_mac[i]) </span> <span class='diff-add'> ); }</span> <span class='diff-add'> for (i=half; i<n; i++) { col2.append( </span> <span class='diff-add'> build_one(key_names_mac[i]) </span> <span class='diff-add'> ); }</span> <span class='diff-add'> sub_div.append(col1).append(col2);</span> <span class='diff-add'> div.append(sub_div);</span> <span class='diff-add'> return div;</span> <span class='diff-add'> };</span> <span class='diff-add'> QuickHelp.prototype.build_command_help = function () {</span> <span class='diff-add'> var command_shortcuts = this.keyboard_manager.command_shortcuts.help();</span> <span class='diff-add'> return build_div('<h4>Command Mode (press <code>Esc</code> to enable)</h4>', command_shortcuts);</span> <span class='diff-add'> };</span> <span class='diff-add'> var special_case = { pageup: "PageUp", pagedown: "Page Down", 'minus': '-' };</span> <span class='diff-add'> var prettify = function (s) {</span> <span class='diff-add'> s = s.replace(/-$/, 'minus'); // catch shortcuts using '-' key</span> <span class='diff-add'> var keys = s.split('-');</span> <span class='diff-add'> var k, i;</span> <span class='diff-add'> for (i=0; i < keys.length; i++) {</span> <span class='diff-add'> k = keys[i];</span> <span class='diff-add'> if ( k.length == 1 ) {</span> <span class='diff-add'> keys[i] = "<code><strong>" + k + "</strong></code>";</span> <span class='diff-add'> continue; // leave individual keys lower-cased</span> <span class='diff-add'> }</span> <span class='diff-add'> if (k.indexOf(',') === -1){</span> <span class='diff-add'> keys[i] = ( special_case[k] ? special_case[k] : k.charAt(0).toUpperCase() + k.slice(1) );</span> <span class='diff-add'> }</span> <span class='diff-add'> keys[i] = "<code><strong>" + keys[i] + "</strong></code>";</span> <span class='diff-add'> }</span> <span class='diff-add'> return keys.join('-');</span> <span class='diff-add'> };</span> <span class='diff-add'> QuickHelp.prototype.build_edit_help = function (cm_shortcuts) {</span> <span class='diff-add'> var edit_shortcuts = this.keyboard_manager.edit_shortcuts.help();</span> <span class='diff-add'> jQuery.merge(cm_shortcuts, edit_shortcuts);</span> <span class='diff-add'> return build_div('<h4>Edit Mode (press <code>Enter</code> to enable)</h4>', cm_shortcuts);</span> <span class='diff-add'> };</span> <span class='diff-add'> var build_one = function (s) {</span> <span class='diff-add'> var help = s.help;</span> <span class='diff-add'> var shortcut = '';</span> <span class='diff-add'> if(s.shortcut){</span> <span class='diff-add'> shortcut = prettify(humanize_sequence(s.shortcut));</span> <span class='diff-add'> }</span> <span class='diff-add'> return $('<div>').addClass('quickhelp').</span> <span class='diff-add'> append($('<span/>').addClass('shortcut_key').append($(shortcut))).</span> <span class='diff-add'> append($('<span/>').addClass('shortcut_descr').text(' : ' + help));</span> <span class='diff-add'> };</span> <span class='diff-add'> var build_div = function (title, shortcuts) {</span> <span class='diff-add'> var i, half, n;</span> <span class='diff-add'> var div = $('<div/>').append($(title));</span> <span class='diff-add'> var sub_div = $('<div/>').addClass('container-fluid');</span> <span class='diff-add'> var col1 = $('<div/>').addClass('col-md-6');</span> <span class='diff-add'> var col2 = $('<div/>').addClass('col-md-6');</span> <span class='diff-add'> n = shortcuts.length;</span> <span class='diff-add'> half = ~~(n/2); // Truncate :)</span> <span class='diff-add'> for (i=0; i<half; i++) { col1.append( build_one(shortcuts[i]) ); }</span> <span class='diff-add'> for (i=half; i<n; i++) { col2.append( build_one(shortcuts[i]) ); }</span> <span class='diff-add'> sub_div.append(col1).append(col2);</span> <span class='diff-add'> div.append(sub_div);</span> <span class='diff-add'> return div;</span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatability.</span> <span class='diff-add'> IPython.QuickHelp = QuickHelp;</span> <span class='diff-add'> return {'QuickHelp': QuickHelp};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/rawcell.js b/ipynb/Array-feature-overlap-05_files/rawcell.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..7a33ed2</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/rawcell.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'notebook/js/celltoolbar',</span> <span class='diff-add'> 'base/js/dialog',</span> <span class='diff-add'> 'base/js/keyboard',</span> <span class='diff-add'>], function($, celltoolbar, dialog, keyboard) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var CellToolbar = celltoolbar.CellToolbar;</span> <span class='diff-add'> var raw_cell_preset = [];</span> <span class='diff-add'> var select_type = CellToolbar.utils.select_ui_generator([</span> <span class='diff-add'> ["None", "-"],</span> <span class='diff-add'> ["LaTeX", "text/latex"],</span> <span class='diff-add'> ["reST", "text/restructuredtext"],</span> <span class='diff-add'> ["HTML", "text/html"],</span> <span class='diff-add'> ["Markdown", "text/markdown"],</span> <span class='diff-add'> ["Python", "text/x-python"],</span> <span class='diff-add'> ["Custom", "dialog"],</span> <span class='diff-add'> ],</span> <span class='diff-add'> // setter</span> <span class='diff-add'> function(cell, value) {</span> <span class='diff-add'> if (value === "-") {</span> <span class='diff-add'> delete cell.metadata.raw_mimetype;</span> <span class='diff-add'> } else if (value === 'dialog'){</span> <span class='diff-add'> var dialog = $('<div/>').append(</span> <span class='diff-add'> $("<p/>")</span> <span class='diff-add'> .text("Set the MIME type of the raw cell:")</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $("<br/>")</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $('<input/>').attr('type','text').attr('size','25')</span> <span class='diff-add'> .val(cell.metadata.raw_mimetype || "-")</span> <span class='diff-add'> );</span> <span class='diff-add'> dialog.modal({</span> <span class='diff-add'> title: "Raw Cell MIME Type",</span> <span class='diff-add'> body: dialog,</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> "Cancel": {},</span> <span class='diff-add'> "OK": {</span> <span class='diff-add'> class: "btn-primary",</span> <span class='diff-add'> click: function () {</span> <span class='diff-add'> console.log(cell);</span> <span class='diff-add'> cell.metadata.raw_mimetype = $(this).find('input').val();</span> <span class='diff-add'> console.log(cell.metadata);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> open : function (event, ui) {</span> <span class='diff-add'> var that = $(this);</span> <span class='diff-add'> // Upon ENTER, click the OK button.</span> <span class='diff-add'> that.find('input[type="text"]').keydown(function (event, ui) {</span> <span class='diff-add'> if (event.which === keyboard.keycodes.enter) {</span> <span class='diff-add'> that.find('.btn-primary').first().click();</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> that.find('input[type="text"]').focus().select();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> } else {</span> <span class='diff-add'> cell.metadata.raw_mimetype = value;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> //getter</span> <span class='diff-add'> function(cell) {</span> <span class='diff-add'> return cell.metadata.raw_mimetype || "";</span> <span class='diff-add'> },</span> <span class='diff-add'> // name</span> <span class='diff-add'> "Raw NBConvert Format"</span> <span class='diff-add'> );</span> <span class='diff-add'> var register = function (notebook) {</span> <span class='diff-add'> CellToolbar.register_callback('raw_cell.select', select_type, ['raw']);</span> <span class='diff-add'> raw_cell_preset.push('raw_cell.select');</span> <span class='diff-add'> CellToolbar.register_preset('Raw Cell Format', raw_cell_preset, notebook);</span> <span class='diff-add'> console.log('Raw Cell Format toolbar preset loaded.');</span> <span class='diff-add'> };</span> <span class='diff-add'> return {'register': register};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/require.js b/ipynb/Array-feature-overlap-05_files/require.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..77a5bb1</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/require.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>/** vim: et:ts=4:sw=4:sts=4</span> <span class='diff-add'> * @license RequireJS 2.1.15 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved.</span> <span class='diff-add'> * Available via the MIT or new BSD license.</span> <span class='diff-add'> * see: http://github.com/jrburke/requirejs for details</span> <span class='diff-add'> */</span> <span class='diff-add'>//Not using strict: uneven strict support in browsers, #392, and causes</span> <span class='diff-add'>//problems with requirejs.exec()/transpiler plugins that may not be strict.</span> <span class='diff-add'>/*jslint regexp: true, nomen: true, sloppy: true */</span> <span class='diff-add'>/*global window, navigator, document, importScripts, setTimeout, opera */</span> <span class='diff-add'>var requirejs, require, define;</span> <span class='diff-add'>(function (global) {</span> <span class='diff-add'> var req, s, head, baseElement, dataMain, src,</span> <span class='diff-add'> interactiveScript, currentlyAddingScript, mainScript, subPath,</span> <span class='diff-add'> version = '2.1.15',</span> <span class='diff-add'> commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,</span> <span class='diff-add'> cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,</span> <span class='diff-add'> jsSuffixRegExp = /\.js$/,</span> <span class='diff-add'> currDirRegExp = /^\.\//,</span> <span class='diff-add'> op = Object.prototype,</span> <span class='diff-add'> ostring = op.toString,</span> <span class='diff-add'> hasOwn = op.hasOwnProperty,</span> <span class='diff-add'> ap = Array.prototype,</span> <span class='diff-add'> apsp = ap.splice,</span> <span class='diff-add'> isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document),</span> <span class='diff-add'> isWebWorker = !isBrowser && typeof importScripts !== 'undefined',</span> <span class='diff-add'> //PS3 indicates loaded and complete, but need to wait for complete</span> <span class='diff-add'> //specifically. Sequence is 'loading', 'loaded', execution,</span> <span class='diff-add'> // then 'complete'. The UA check is unfortunate, but not sure how</span> <span class='diff-add'> //to feature test w/o causing perf issues.</span> <span class='diff-add'> readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ?</span> <span class='diff-add'> /^complete$/ : /^(complete|loaded)$/,</span> <span class='diff-add'> defContextName = '_',</span> <span class='diff-add'> //Oh the tragedy, detecting opera. See the usage of isOpera for reason.</span> <span class='diff-add'> isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]',</span> <span class='diff-add'> contexts = {},</span> <span class='diff-add'> cfg = {},</span> <span class='diff-add'> globalDefQueue = [],</span> <span class='diff-add'> useInteractive = false;</span> <span class='diff-add'> function isFunction(it) {</span> <span class='diff-add'> return ostring.call(it) === '[object Function]';</span> <span class='diff-add'> }</span> <span class='diff-add'> function isArray(it) {</span> <span class='diff-add'> return ostring.call(it) === '[object Array]';</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Helper function for iterating over an array. If the func returns</span> <span class='diff-add'> * a true value, it will break out of the loop.</span> <span class='diff-add'> */</span> <span class='diff-add'> function each(ary, func) {</span> <span class='diff-add'> if (ary) {</span> <span class='diff-add'> var i;</span> <span class='diff-add'> for (i = 0; i < ary.length; i += 1) {</span> <span class='diff-add'> if (ary[i] && func(ary[i], i, ary)) {</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Helper function for iterating over an array backwards. If the func</span> <span class='diff-add'> * returns a true value, it will break out of the loop.</span> <span class='diff-add'> */</span> <span class='diff-add'> function eachReverse(ary, func) {</span> <span class='diff-add'> if (ary) {</span> <span class='diff-add'> var i;</span> <span class='diff-add'> for (i = ary.length - 1; i > -1; i -= 1) {</span> <span class='diff-add'> if (ary[i] && func(ary[i], i, ary)) {</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function hasProp(obj, prop) {</span> <span class='diff-add'> return hasOwn.call(obj, prop);</span> <span class='diff-add'> }</span> <span class='diff-add'> function getOwn(obj, prop) {</span> <span class='diff-add'> return hasProp(obj, prop) && obj[prop];</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Cycles over properties in an object and calls a function for each</span> <span class='diff-add'> * property value. If the function returns a truthy value, then the</span> <span class='diff-add'> * iteration is stopped.</span> <span class='diff-add'> */</span> <span class='diff-add'> function eachProp(obj, func) {</span> <span class='diff-add'> var prop;</span> <span class='diff-add'> for (prop in obj) {</span> <span class='diff-add'> if (hasProp(obj, prop)) {</span> <span class='diff-add'> if (func(obj[prop], prop)) {</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Simple function to mix in properties from source into target,</span> <span class='diff-add'> * but only if target does not already have a property of the same name.</span> <span class='diff-add'> */</span> <span class='diff-add'> function mixin(target, source, force, deepStringMixin) {</span> <span class='diff-add'> if (source) {</span> <span class='diff-add'> eachProp(source, function (value, prop) {</span> <span class='diff-add'> if (force || !hasProp(target, prop)) {</span> <span class='diff-add'> if (deepStringMixin && typeof value === 'object' && value &&</span> <span class='diff-add'> !isArray(value) && !isFunction(value) &&</span> <span class='diff-add'> !(value instanceof RegExp)) {</span> <span class='diff-add'> if (!target[prop]) {</span> <span class='diff-add'> target[prop] = {};</span> <span class='diff-add'> }</span> <span class='diff-add'> mixin(target[prop], value, force, deepStringMixin);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> target[prop] = value;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> return target;</span> <span class='diff-add'> }</span> <span class='diff-add'> //Similar to Function.prototype.bind, but the 'this' object is specified</span> <span class='diff-add'> //first, since it is easier to read/figure out what 'this' will be.</span> <span class='diff-add'> function bind(obj, fn) {</span> <span class='diff-add'> return function () {</span> <span class='diff-add'> return fn.apply(obj, arguments);</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> function scripts() {</span> <span class='diff-add'> return document.getElementsByTagName('script');</span> <span class='diff-add'> }</span> <span class='diff-add'> function defaultOnError(err) {</span> <span class='diff-add'> throw err;</span> <span class='diff-add'> }</span> <span class='diff-add'> //Allow getting a global that is expressed in</span> <span class='diff-add'> //dot notation, like 'a.b.c'.</span> <span class='diff-add'> function getGlobal(value) {</span> <span class='diff-add'> if (!value) {</span> <span class='diff-add'> return value;</span> <span class='diff-add'> }</span> <span class='diff-add'> var g = global;</span> <span class='diff-add'> each(value.split('.'), function (part) {</span> <span class='diff-add'> g = g[part];</span> <span class='diff-add'> });</span> <span class='diff-add'> return g;</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Constructs an error with a pointer to an URL with more information.</span> <span class='diff-add'> * @param {String} id the error ID that maps to an ID on a web page.</span> <span class='diff-add'> * @param {String} message human readable error.</span> <span class='diff-add'> * @param {Error} [err] the original error, if there is one.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @returns {Error}</span> <span class='diff-add'> */</span> <span class='diff-add'> function makeError(id, msg, err, requireModules) {</span> <span class='diff-add'> var e = new Error(msg + '\nhttp://requirejs.org/docs/errors.html#' + id);</span> <span class='diff-add'> e.requireType = id;</span> <span class='diff-add'> e.requireModules = requireModules;</span> <span class='diff-add'> if (err) {</span> <span class='diff-add'> e.originalError = err;</span> <span class='diff-add'> }</span> <span class='diff-add'> return e;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (typeof define !== 'undefined') {</span> <span class='diff-add'> //If a define is already in play via another AMD loader,</span> <span class='diff-add'> //do not overwrite.</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (typeof requirejs !== 'undefined') {</span> <span class='diff-add'> if (isFunction(requirejs)) {</span> <span class='diff-add'> //Do not overwrite an existing requirejs instance.</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> cfg = requirejs;</span> <span class='diff-add'> requirejs = undefined;</span> <span class='diff-add'> }</span> <span class='diff-add'> //Allow for a require config object</span> <span class='diff-add'> if (typeof require !== 'undefined' && !isFunction(require)) {</span> <span class='diff-add'> //assume it is a config object.</span> <span class='diff-add'> cfg = require;</span> <span class='diff-add'> require = undefined;</span> <span class='diff-add'> }</span> <span class='diff-add'> function newContext(contextName) {</span> <span class='diff-add'> var inCheckLoaded, Module, context, handlers,</span> <span class='diff-add'> checkLoadedTimeoutId,</span> <span class='diff-add'> config = {</span> <span class='diff-add'> //Defaults. Do not set a default for map</span> <span class='diff-add'> //config to speed up normalize(), which</span> <span class='diff-add'> //will run faster if there is no default.</span> <span class='diff-add'> waitSeconds: 7,</span> <span class='diff-add'> baseUrl: './',</span> <span class='diff-add'> paths: {},</span> <span class='diff-add'> bundles: {},</span> <span class='diff-add'> pkgs: {},</span> <span class='diff-add'> shim: {},</span> <span class='diff-add'> config: {}</span> <span class='diff-add'> },</span> <span class='diff-add'> registry = {},</span> <span class='diff-add'> //registry of just enabled modules, to speed</span> <span class='diff-add'> //cycle breaking code when lots of modules</span> <span class='diff-add'> //are registered, but not activated.</span> <span class='diff-add'> enabledRegistry = {},</span> <span class='diff-add'> undefEvents = {},</span> <span class='diff-add'> defQueue = [],</span> <span class='diff-add'> defined = {},</span> <span class='diff-add'> urlFetched = {},</span> <span class='diff-add'> bundlesMap = {},</span> <span class='diff-add'> requireCounter = 1,</span> <span class='diff-add'> unnormalizedCounter = 1;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Trims the . and .. from an array of path segments.</span> <span class='diff-add'> * It will keep a leading path segment if a .. will become</span> <span class='diff-add'> * the first path segment, to help with module name lookups,</span> <span class='diff-add'> * which act like paths, but can be remapped. But the end result,</span> <span class='diff-add'> * all paths that use this function should look normalized.</span> <span class='diff-add'> * NOTE: this method MODIFIES the input array.</span> <span class='diff-add'> * @param {Array} ary the array of path segments.</span> <span class='diff-add'> */</span> <span class='diff-add'> function trimDots(ary) {</span> <span class='diff-add'> var i, part;</span> <span class='diff-add'> for (i = 0; i < ary.length; i++) {</span> <span class='diff-add'> part = ary[i];</span> <span class='diff-add'> if (part === '.') {</span> <span class='diff-add'> ary.splice(i, 1);</span> <span class='diff-add'> i -= 1;</span> <span class='diff-add'> } else if (part === '..') {</span> <span class='diff-add'> // If at the start, or previous value is still ..,</span> <span class='diff-add'> // keep them so that when converted to a path it may</span> <span class='diff-add'> // still work when converted to a path, even though</span> <span class='diff-add'> // as an ID it is less than ideal. In larger point</span> <span class='diff-add'> // releases, may be better to just kick out an error.</span> <span class='diff-add'> if (i === 0 || (i == 1 && ary[2] === '..') || ary[i - 1] === '..') {</span> <span class='diff-add'> continue;</span> <span class='diff-add'> } else if (i > 0) {</span> <span class='diff-add'> ary.splice(i - 1, 2);</span> <span class='diff-add'> i -= 2;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Given a relative module name, like ./something, normalize it to</span> <span class='diff-add'> * a real name that can be mapped to a path.</span> <span class='diff-add'> * @param {String} name the relative name</span> <span class='diff-add'> * @param {String} baseName a real name that the name arg is relative</span> <span class='diff-add'> * to.</span> <span class='diff-add'> * @param {Boolean} applyMap apply the map config to the value. Should</span> <span class='diff-add'> * only be done if this normalization is for a dependency ID.</span> <span class='diff-add'> * @returns {String} normalized name</span> <span class='diff-add'> */</span> <span class='diff-add'> function normalize(name, baseName, applyMap) {</span> <span class='diff-add'> var pkgMain, mapValue, nameParts, i, j, nameSegment, lastIndex,</span> <span class='diff-add'> foundMap, foundI, foundStarMap, starI, normalizedBaseParts,</span> <span class='diff-add'> baseParts = (baseName && baseName.split('/')),</span> <span class='diff-add'> map = config.map,</span> <span class='diff-add'> starMap = map && map['*'];</span> <span class='diff-add'> //Adjust any relative paths.</span> <span class='diff-add'> if (name) {</span> <span class='diff-add'> name = name.split('/');</span> <span class='diff-add'> lastIndex = name.length - 1;</span> <span class='diff-add'> // If wanting node ID compatibility, strip .js from end</span> <span class='diff-add'> // of IDs. Have to do this here, and not in nameToUrl</span> <span class='diff-add'> // because node allows either .js or non .js to map</span> <span class='diff-add'> // to same file.</span> <span class='diff-add'> if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {</span> <span class='diff-add'> name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');</span> <span class='diff-add'> }</span> <span class='diff-add'> // Starts with a '.' so need the baseName</span> <span class='diff-add'> if (name[0].charAt(0) === '.' && baseParts) {</span> <span class='diff-add'> //Convert baseName to array, and lop off the last part,</span> <span class='diff-add'> //so that . matches that 'directory' and not name of the baseName's</span> <span class='diff-add'> //module. For instance, baseName of 'one/two/three', maps to</span> <span class='diff-add'> //'one/two/three.js', but we want the directory, 'one/two' for</span> <span class='diff-add'> //this normalization.</span> <span class='diff-add'> normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);</span> <span class='diff-add'> name = normalizedBaseParts.concat(name);</span> <span class='diff-add'> }</span> <span class='diff-add'> trimDots(name);</span> <span class='diff-add'> name = name.join('/');</span> <span class='diff-add'> }</span> <span class='diff-add'> //Apply map config if available.</span> <span class='diff-add'> if (applyMap && map && (baseParts || starMap)) {</span> <span class='diff-add'> nameParts = name.split('/');</span> <span class='diff-add'> outerLoop: for (i = nameParts.length; i > 0; i -= 1) {</span> <span class='diff-add'> nameSegment = nameParts.slice(0, i).join('/');</span> <span class='diff-add'> if (baseParts) {</span> <span class='diff-add'> //Find the longest baseName segment match in the config.</span> <span class='diff-add'> //So, do joins on the biggest to smallest lengths of baseParts.</span> <span class='diff-add'> for (j = baseParts.length; j > 0; j -= 1) {</span> <span class='diff-add'> mapValue = getOwn(map, baseParts.slice(0, j).join('/'));</span> <span class='diff-add'> //baseName segment has config, find if it has one for</span> <span class='diff-add'> //this name.</span> <span class='diff-add'> if (mapValue) {</span> <span class='diff-add'> mapValue = getOwn(mapValue, nameSegment);</span> <span class='diff-add'> if (mapValue) {</span> <span class='diff-add'> //Match, update name to the new value.</span> <span class='diff-add'> foundMap = mapValue;</span> <span class='diff-add'> foundI = i;</span> <span class='diff-add'> break outerLoop;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> //Check for a star map match, but just hold on to it,</span> <span class='diff-add'> //if there is a shorter segment match later in a matching</span> <span class='diff-add'> //config, then favor over this star map.</span> <span class='diff-add'> if (!foundStarMap && starMap && getOwn(starMap, nameSegment)) {</span> <span class='diff-add'> foundStarMap = getOwn(starMap, nameSegment);</span> <span class='diff-add'> starI = i;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!foundMap && foundStarMap) {</span> <span class='diff-add'> foundMap = foundStarMap;</span> <span class='diff-add'> foundI = starI;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (foundMap) {</span> <span class='diff-add'> nameParts.splice(0, foundI, foundMap);</span> <span class='diff-add'> name = nameParts.join('/');</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // If the name points to a package's name, use</span> <span class='diff-add'> // the package main instead.</span> <span class='diff-add'> pkgMain = getOwn(config.pkgs, name);</span> <span class='diff-add'> return pkgMain ? pkgMain : name;</span> <span class='diff-add'> }</span> <span class='diff-add'> function removeScript(name) {</span> <span class='diff-add'> if (isBrowser) {</span> <span class='diff-add'> each(scripts(), function (scriptNode) {</span> <span class='diff-add'> if (scriptNode.getAttribute('data-requiremodule') === name &&</span> <span class='diff-add'> scriptNode.getAttribute('data-requirecontext') === context.contextName) {</span> <span class='diff-add'> scriptNode.parentNode.removeChild(scriptNode);</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function hasPathFallback(id) {</span> <span class='diff-add'> var pathConfig = getOwn(config.paths, id);</span> <span class='diff-add'> if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) {</span> <span class='diff-add'> //Pop off the first array value, since it failed, and</span> <span class='diff-add'> //retry</span> <span class='diff-add'> pathConfig.shift();</span> <span class='diff-add'> context.require.undef(id);</span> <span class='diff-add'> //Custom require that does not do map translation, since</span> <span class='diff-add'> //ID is "absolute", already mapped/resolved.</span> <span class='diff-add'> context.makeRequire(null, {</span> <span class='diff-add'> skipMap: true</span> <span class='diff-add'> })([id]);</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> //Turns a plugin!resource to [plugin, resource]</span> <span class='diff-add'> //with the plugin being undefined if the name</span> <span class='diff-add'> //did not have a plugin prefix.</span> <span class='diff-add'> function splitPrefix(name) {</span> <span class='diff-add'> var prefix,</span> <span class='diff-add'> index = name ? name.indexOf('!') : -1;</span> <span class='diff-add'> if (index > -1) {</span> <span class='diff-add'> prefix = name.substring(0, index);</span> <span class='diff-add'> name = name.substring(index + 1, name.length);</span> <span class='diff-add'> }</span> <span class='diff-add'> return [prefix, name];</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Creates a module mapping that includes plugin prefix, module</span> <span class='diff-add'> * name, and path. If parentModuleMap is provided it will</span> <span class='diff-add'> * also normalize the name via require.normalize()</span> <span class='diff-add'> *</span> <span class='diff-add'> * @param {String} name the module name</span> <span class='diff-add'> * @param {String} [parentModuleMap] parent module map</span> <span class='diff-add'> * for the module name, used to resolve relative names.</span> <span class='diff-add'> * @param {Boolean} isNormalized: is the ID already normalized.</span> <span class='diff-add'> * This is true if this call is done for a define() module ID.</span> <span class='diff-add'> * @param {Boolean} applyMap: apply the map config to the ID.</span> <span class='diff-add'> * Should only be true if this map is for a dependency.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @returns {Object}</span> <span class='diff-add'> */</span> <span class='diff-add'> function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) {</span> <span class='diff-add'> var url, pluginModule, suffix, nameParts,</span> <span class='diff-add'> prefix = null,</span> <span class='diff-add'> parentName = parentModuleMap ? parentModuleMap.name : null,</span> <span class='diff-add'> originalName = name,</span> <span class='diff-add'> isDefine = true,</span> <span class='diff-add'> normalizedName = '';</span> <span class='diff-add'> //If no name, then it means it is a require call, generate an</span> <span class='diff-add'> //internal name.</span> <span class='diff-add'> if (!name) {</span> <span class='diff-add'> isDefine = false;</span> <span class='diff-add'> name = '_@r' + (requireCounter += 1);</span> <span class='diff-add'> }</span> <span class='diff-add'> nameParts = splitPrefix(name);</span> <span class='diff-add'> prefix = nameParts[0];</span> <span class='diff-add'> name = nameParts[1];</span> <span class='diff-add'> if (prefix) {</span> <span class='diff-add'> prefix = normalize(prefix, parentName, applyMap);</span> <span class='diff-add'> pluginModule = getOwn(defined, prefix);</span> <span class='diff-add'> }</span> <span class='diff-add'> //Account for relative paths if there is a base name.</span> <span class='diff-add'> if (name) {</span> <span class='diff-add'> if (prefix) {</span> <span class='diff-add'> if (pluginModule && pluginModule.normalize) {</span> <span class='diff-add'> //Plugin is loaded, use its normalize method.</span> <span class='diff-add'> normalizedName = pluginModule.normalize(name, function (name) {</span> <span class='diff-add'> return normalize(name, parentName, applyMap);</span> <span class='diff-add'> });</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // If nested plugin references, then do not try to</span> <span class='diff-add'> // normalize, as it will not normalize correctly. This</span> <span class='diff-add'> // places a restriction on resourceIds, and the longer</span> <span class='diff-add'> // term solution is not to normalize until plugins are</span> <span class='diff-add'> // loaded and all normalizations to allow for async</span> <span class='diff-add'> // loading of a loader plugin. But for now, fixes the</span> <span class='diff-add'> // common uses. Details in #1131</span> <span class='diff-add'> normalizedName = name.indexOf('!') === -1 ?</span> <span class='diff-add'> normalize(name, parentName, applyMap) :</span> <span class='diff-add'> name;</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> //A regular module.</span> <span class='diff-add'> normalizedName = normalize(name, parentName, applyMap);</span> <span class='diff-add'> //Normalized name may be a plugin ID due to map config</span> <span class='diff-add'> //application in normalize. The map config values must</span> <span class='diff-add'> //already be normalized, so do not need to redo that part.</span> <span class='diff-add'> nameParts = splitPrefix(normalizedName);</span> <span class='diff-add'> prefix = nameParts[0];</span> <span class='diff-add'> normalizedName = nameParts[1];</span> <span class='diff-add'> isNormalized = true;</span> <span class='diff-add'> url = context.nameToUrl(normalizedName);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> //If the id is a plugin id that cannot be determined if it needs</span> <span class='diff-add'> //normalization, stamp it with a unique ID so two matching relative</span> <span class='diff-add'> //ids that may conflict can be separate.</span> <span class='diff-add'> suffix = prefix && !pluginModule && !isNormalized ?</span> <span class='diff-add'> '_unnormalized' + (unnormalizedCounter += 1) :</span> <span class='diff-add'> '';</span> <span class='diff-add'> return {</span> <span class='diff-add'> prefix: prefix,</span> <span class='diff-add'> name: normalizedName,</span> <span class='diff-add'> parentMap: parentModuleMap,</span> <span class='diff-add'> unnormalized: !!suffix,</span> <span class='diff-add'> url: url,</span> <span class='diff-add'> originalName: originalName,</span> <span class='diff-add'> isDefine: isDefine,</span> <span class='diff-add'> id: (prefix ?</span> <span class='diff-add'> prefix + '!' + normalizedName :</span> <span class='diff-add'> normalizedName) + suffix</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> function getModule(depMap) {</span> <span class='diff-add'> var id = depMap.id,</span> <span class='diff-add'> mod = getOwn(registry, id);</span> <span class='diff-add'> if (!mod) {</span> <span class='diff-add'> mod = registry[id] = new context.Module(depMap);</span> <span class='diff-add'> }</span> <span class='diff-add'> return mod;</span> <span class='diff-add'> }</span> <span class='diff-add'> function on(depMap, name, fn) {</span> <span class='diff-add'> var id = depMap.id,</span> <span class='diff-add'> mod = getOwn(registry, id);</span> <span class='diff-add'> if (hasProp(defined, id) &&</span> <span class='diff-add'> (!mod || mod.defineEmitComplete)) {</span> <span class='diff-add'> if (name === 'defined') {</span> <span class='diff-add'> fn(defined[id]);</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> mod = getModule(depMap);</span> <span class='diff-add'> if (mod.error && name === 'error') {</span> <span class='diff-add'> fn(mod.error);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> mod.on(name, fn);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function onError(err, errback) {</span> <span class='diff-add'> var ids = err.requireModules,</span> <span class='diff-add'> notified = false;</span> <span class='diff-add'> if (errback) {</span> <span class='diff-add'> errback(err);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> each(ids, function (id) {</span> <span class='diff-add'> var mod = getOwn(registry, id);</span> <span class='diff-add'> if (mod) {</span> <span class='diff-add'> //Set error on module, so it skips timeout checks.</span> <span class='diff-add'> mod.error = err;</span> <span class='diff-add'> if (mod.events.error) {</span> <span class='diff-add'> notified = true;</span> <span class='diff-add'> mod.emit('error', err);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> if (!notified) {</span> <span class='diff-add'> req.onError(err);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Internal method to transfer globalQueue items to this context's</span> <span class='diff-add'> * defQueue.</span> <span class='diff-add'> */</span> <span class='diff-add'> function takeGlobalQueue() {</span> <span class='diff-add'> //Push all the globalDefQueue items into the context's defQueue</span> <span class='diff-add'> if (globalDefQueue.length) {</span> <span class='diff-add'> //Array splice in the values since the context code has a</span> <span class='diff-add'> //local var ref to defQueue, so cannot just reassign the one</span> <span class='diff-add'> //on context.</span> <span class='diff-add'> apsp.apply(defQueue,</span> <span class='diff-add'> [defQueue.length, 0].concat(globalDefQueue));</span> <span class='diff-add'> globalDefQueue = [];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> handlers = {</span> <span class='diff-add'> 'require': function (mod) {</span> <span class='diff-add'> if (mod.require) {</span> <span class='diff-add'> return mod.require;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return (mod.require = context.makeRequire(mod.map));</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> 'exports': function (mod) {</span> <span class='diff-add'> mod.usingExports = true;</span> <span class='diff-add'> if (mod.map.isDefine) {</span> <span class='diff-add'> if (mod.exports) {</span> <span class='diff-add'> return (defined[mod.map.id] = mod.exports);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return (mod.exports = defined[mod.map.id] = {});</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> 'module': function (mod) {</span> <span class='diff-add'> if (mod.module) {</span> <span class='diff-add'> return mod.module;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return (mod.module = {</span> <span class='diff-add'> id: mod.map.id,</span> <span class='diff-add'> uri: mod.map.url,</span> <span class='diff-add'> config: function () {</span> <span class='diff-add'> return getOwn(config.config, mod.map.id) || {};</span> <span class='diff-add'> },</span> <span class='diff-add'> exports: mod.exports || (mod.exports = {})</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> function cleanRegistry(id) {</span> <span class='diff-add'> //Clean up machinery used for waiting modules.</span> <span class='diff-add'> delete registry[id];</span> <span class='diff-add'> delete enabledRegistry[id];</span> <span class='diff-add'> }</span> <span class='diff-add'> function breakCycle(mod, traced, processed) {</span> <span class='diff-add'> var id = mod.map.id;</span> <span class='diff-add'> if (mod.error) {</span> <span class='diff-add'> mod.emit('error', mod.error);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> traced[id] = true;</span> <span class='diff-add'> each(mod.depMaps, function (depMap, i) {</span> <span class='diff-add'> var depId = depMap.id,</span> <span class='diff-add'> dep = getOwn(registry, depId);</span> <span class='diff-add'> //Only force things that have not completed</span> <span class='diff-add'> //being defined, so still in the registry,</span> <span class='diff-add'> //and only if it has not been matched up</span> <span class='diff-add'> //in the module already.</span> <span class='diff-add'> if (dep && !mod.depMatched[i] && !processed[depId]) {</span> <span class='diff-add'> if (getOwn(traced, depId)) {</span> <span class='diff-add'> mod.defineDep(i, defined[depId]);</span> <span class='diff-add'> mod.check(); //pass false?</span> <span class='diff-add'> } else {</span> <span class='diff-add'> breakCycle(dep, traced, processed);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> processed[id] = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function checkLoaded() {</span> <span class='diff-add'> var err, usingPathFallback,</span> <span class='diff-add'> waitInterval = config.waitSeconds * 1000,</span> <span class='diff-add'> //It is possible to disable the wait interval by using waitSeconds of 0.</span> <span class='diff-add'> expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(),</span> <span class='diff-add'> noLoads = [],</span> <span class='diff-add'> reqCalls = [],</span> <span class='diff-add'> stillLoading = false,</span> <span class='diff-add'> needCycleCheck = true;</span> <span class='diff-add'> //Do not bother if this call was a result of a cycle break.</span> <span class='diff-add'> if (inCheckLoaded) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> inCheckLoaded = true;</span> <span class='diff-add'> //Figure out the state of all the modules.</span> <span class='diff-add'> eachProp(enabledRegistry, function (mod) {</span> <span class='diff-add'> var map = mod.map,</span> <span class='diff-add'> modId = map.id;</span> <span class='diff-add'> //Skip things that are not enabled or in error state.</span> <span class='diff-add'> if (!mod.enabled) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!map.isDefine) {</span> <span class='diff-add'> reqCalls.push(mod);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (!mod.error) {</span> <span class='diff-add'> //If the module should be executed, and it has not</span> <span class='diff-add'> //been inited and time is up, remember it.</span> <span class='diff-add'> if (!mod.inited && expired) {</span> <span class='diff-add'> if (hasPathFallback(modId)) {</span> <span class='diff-add'> usingPathFallback = true;</span> <span class='diff-add'> stillLoading = true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> noLoads.push(modId);</span> <span class='diff-add'> removeScript(modId);</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (!mod.inited && mod.fetched && map.isDefine) {</span> <span class='diff-add'> stillLoading = true;</span> <span class='diff-add'> if (!map.prefix) {</span> <span class='diff-add'> //No reason to keep looking for unfinished</span> <span class='diff-add'> //loading. If the only stillLoading is a</span> <span class='diff-add'> //plugin resource though, keep going,</span> <span class='diff-add'> //because it may be that a plugin resource</span> <span class='diff-add'> //is waiting on a non-plugin cycle.</span> <span class='diff-add'> return (needCycleCheck = false);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> if (expired && noLoads.length) {</span> <span class='diff-add'> //If wait time expired, throw error of unloaded modules.</span> <span class='diff-add'> err = makeError('timeout', 'Load timeout for modules: ' + noLoads, null, noLoads);</span> <span class='diff-add'> err.contextName = context.contextName;</span> <span class='diff-add'> return onError(err);</span> <span class='diff-add'> }</span> <span class='diff-add'> //Not expired, check for a cycle.</span> <span class='diff-add'> if (needCycleCheck) {</span> <span class='diff-add'> each(reqCalls, function (mod) {</span> <span class='diff-add'> breakCycle(mod, {}, {});</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> //If still waiting on loads, and the waiting load is something</span> <span class='diff-add'> //other than a plugin resource, or there are still outstanding</span> <span class='diff-add'> //scripts, then just try back later.</span> <span class='diff-add'> if ((!expired || usingPathFallback) && stillLoading) {</span> <span class='diff-add'> //Something is still waiting to load. Wait for it, but only</span> <span class='diff-add'> //if a timeout is not already in effect.</span> <span class='diff-add'> if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {</span> <span class='diff-add'> checkLoadedTimeoutId = setTimeout(function () {</span> <span class='diff-add'> checkLoadedTimeoutId = 0;</span> <span class='diff-add'> checkLoaded();</span> <span class='diff-add'> }, 50);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> inCheckLoaded = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> Module = function (map) {</span> <span class='diff-add'> this.events = getOwn(undefEvents, map.id) || {};</span> <span class='diff-add'> this.map = map;</span> <span class='diff-add'> this.shim = getOwn(config.shim, map.id);</span> <span class='diff-add'> this.depExports = [];</span> <span class='diff-add'> this.depMaps = [];</span> <span class='diff-add'> this.depMatched = [];</span> <span class='diff-add'> this.pluginMaps = {};</span> <span class='diff-add'> this.depCount = 0;</span> <span class='diff-add'> /* this.exports this.factory</span> <span class='diff-add'> this.depMaps = [],</span> <span class='diff-add'> this.enabled, this.fetched</span> <span class='diff-add'> */</span> <span class='diff-add'> };</span> <span class='diff-add'> Module.prototype = {</span> <span class='diff-add'> init: function (depMaps, factory, errback, options) {</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> //Do not do more inits if already done. Can happen if there</span> <span class='diff-add'> //are multiple define calls for the same module. That is not</span> <span class='diff-add'> //a normal, common case, but it is also not unexpected.</span> <span class='diff-add'> if (this.inited) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.factory = factory;</span> <span class='diff-add'> if (errback) {</span> <span class='diff-add'> //Register for errors on this module.</span> <span class='diff-add'> this.on('error', errback);</span> <span class='diff-add'> } else if (this.events.error) {</span> <span class='diff-add'> //If no errback already, but there are error listeners</span> <span class='diff-add'> //on this module, set up an errback to pass to the deps.</span> <span class='diff-add'> errback = bind(this, function (err) {</span> <span class='diff-add'> this.emit('error', err);</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> //Do a copy of the dependency array, so that</span> <span class='diff-add'> //source inputs are not modified. For example</span> <span class='diff-add'> //"shim" deps are passed in here directly, and</span> <span class='diff-add'> //doing a direct modification of the depMaps array</span> <span class='diff-add'> //would affect that config.</span> <span class='diff-add'> this.depMaps = depMaps && depMaps.slice(0);</span> <span class='diff-add'> this.errback = errback;</span> <span class='diff-add'> //Indicate this module has be initialized</span> <span class='diff-add'> this.inited = true;</span> <span class='diff-add'> this.ignore = options.ignore;</span> <span class='diff-add'> //Could have option to init this module in enabled mode,</span> <span class='diff-add'> //or could have been previously marked as enabled. However,</span> <span class='diff-add'> //the dependencies are not known until init is called. So</span> <span class='diff-add'> //if enabled previously, now trigger dependencies as enabled.</span> <span class='diff-add'> if (options.enabled || this.enabled) {</span> <span class='diff-add'> //Enable this module and dependencies.</span> <span class='diff-add'> //Will call this.check()</span> <span class='diff-add'> this.enable();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.check();</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> defineDep: function (i, depExports) {</span> <span class='diff-add'> //Because of cycles, defined callback for a given</span> <span class='diff-add'> //export can be called more than once.</span> <span class='diff-add'> if (!this.depMatched[i]) {</span> <span class='diff-add'> this.depMatched[i] = true;</span> <span class='diff-add'> this.depCount -= 1;</span> <span class='diff-add'> this.depExports[i] = depExports;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> fetch: function () {</span> <span class='diff-add'> if (this.fetched) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.fetched = true;</span> <span class='diff-add'> context.startTime = (new Date()).getTime();</span> <span class='diff-add'> var map = this.map;</span> <span class='diff-add'> //If the manager is for a plugin managed resource,</span> <span class='diff-add'> //ask the plugin to load it now.</span> <span class='diff-add'> if (this.shim) {</span> <span class='diff-add'> context.makeRequire(this.map, {</span> <span class='diff-add'> enableBuildCallback: true</span> <span class='diff-add'> })(this.shim.deps || [], bind(this, function () {</span> <span class='diff-add'> return map.prefix ? this.callPlugin() : this.load();</span> <span class='diff-add'> }));</span> <span class='diff-add'> } else {</span> <span class='diff-add'> //Regular dependency.</span> <span class='diff-add'> return map.prefix ? this.callPlugin() : this.load();</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> load: function () {</span> <span class='diff-add'> var url = this.map.url;</span> <span class='diff-add'> //Regular dependency.</span> <span class='diff-add'> if (!urlFetched[url]) {</span> <span class='diff-add'> urlFetched[url] = true;</span> <span class='diff-add'> context.load(this.map.id, url);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Checks if the module is ready to define itself, and if so,</span> <span class='diff-add'> * define it.</span> <span class='diff-add'> */</span> <span class='diff-add'> check: function () {</span> <span class='diff-add'> if (!this.enabled || this.enabling) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var err, cjsModule,</span> <span class='diff-add'> id = this.map.id,</span> <span class='diff-add'> depExports = this.depExports,</span> <span class='diff-add'> exports = this.exports,</span> <span class='diff-add'> factory = this.factory;</span> <span class='diff-add'> if (!this.inited) {</span> <span class='diff-add'> this.fetch();</span> <span class='diff-add'> } else if (this.error) {</span> <span class='diff-add'> this.emit('error', this.error);</span> <span class='diff-add'> } else if (!this.defining) {</span> <span class='diff-add'> //The factory could trigger another require call</span> <span class='diff-add'> //that would result in checking this module to</span> <span class='diff-add'> //define itself again. If already in the process</span> <span class='diff-add'> //of doing that, skip this work.</span> <span class='diff-add'> this.defining = true;</span> <span class='diff-add'> if (this.depCount < 1 && !this.defined) {</span> <span class='diff-add'> if (isFunction(factory)) {</span> <span class='diff-add'> //If there is an error listener, favor passing</span> <span class='diff-add'> //to that instead of throwing an error. However,</span> <span class='diff-add'> //only do it for define()'d modules. require</span> <span class='diff-add'> //errbacks should not be called for failures in</span> <span class='diff-add'> //their callbacks (#699). However if a global</span> <span class='diff-add'> //onError is set, use that.</span> <span class='diff-add'> if ((this.events.error && this.map.isDefine) ||</span> <span class='diff-add'> req.onError !== defaultOnError) {</span> <span class='diff-add'> try {</span> <span class='diff-add'> exports = context.execCb(id, factory, depExports, exports);</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> err = e;</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> exports = context.execCb(id, factory, depExports, exports);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Favor return value over exports. If node/cjs in play,</span> <span class='diff-add'> // then will not have a return value anyway. Favor</span> <span class='diff-add'> // module.exports assignment over exports object.</span> <span class='diff-add'> if (this.map.isDefine && exports === undefined) {</span> <span class='diff-add'> cjsModule = this.module;</span> <span class='diff-add'> if (cjsModule) {</span> <span class='diff-add'> exports = cjsModule.exports;</span> <span class='diff-add'> } else if (this.usingExports) {</span> <span class='diff-add'> //exports already set the defined value.</span> <span class='diff-add'> exports = this.exports;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (err) {</span> <span class='diff-add'> err.requireMap = this.map;</span> <span class='diff-add'> err.requireModules = this.map.isDefine ? [this.map.id] : null;</span> <span class='diff-add'> err.requireType = this.map.isDefine ? 'define' : 'require';</span> <span class='diff-add'> return onError((this.error = err));</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> //Just a literal value</span> <span class='diff-add'> exports = factory;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.exports = exports;</span> <span class='diff-add'> if (this.map.isDefine && !this.ignore) {</span> <span class='diff-add'> defined[id] = exports;</span> <span class='diff-add'> if (req.onResourceLoad) {</span> <span class='diff-add'> req.onResourceLoad(context, this.map, this.depMaps);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> //Clean up</span> <span class='diff-add'> cleanRegistry(id);</span> <span class='diff-add'> this.defined = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> //Finished the define stage. Allow calling check again</span> <span class='diff-add'> //to allow define notifications below in the case of a</span> <span class='diff-add'> //cycle.</span> <span class='diff-add'> this.defining = false;</span> <span class='diff-add'> if (this.defined && !this.defineEmitted) {</span> <span class='diff-add'> this.defineEmitted = true;</span> <span class='diff-add'> this.emit('defined', this.exports);</span> <span class='diff-add'> this.defineEmitComplete = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> callPlugin: function () {</span> <span class='diff-add'> var map = this.map,</span> <span class='diff-add'> id = map.id,</span> <span class='diff-add'> //Map already normalized the prefix.</span> <span class='diff-add'> pluginMap = makeModuleMap(map.prefix);</span> <span class='diff-add'> //Mark this as a dependency for this plugin, so it</span> <span class='diff-add'> //can be traced for cycles.</span> <span class='diff-add'> this.depMaps.push(pluginMap);</span> <span class='diff-add'> on(pluginMap, 'defined', bind(this, function (plugin) {</span> <span class='diff-add'> var load, normalizedMap, normalizedMod,</span> <span class='diff-add'> bundleId = getOwn(bundlesMap, this.map.id),</span> <span class='diff-add'> name = this.map.name,</span> <span class='diff-add'> parentName = this.map.parentMap ? this.map.parentMap.name : null,</span> <span class='diff-add'> localRequire = context.makeRequire(map.parentMap, {</span> <span class='diff-add'> enableBuildCallback: true</span> <span class='diff-add'> });</span> <span class='diff-add'> //If current map is not normalized, wait for that</span> <span class='diff-add'> //normalized name to load instead of continuing.</span> <span class='diff-add'> if (this.map.unnormalized) {</span> <span class='diff-add'> //Normalize the ID if the plugin allows it.</span> <span class='diff-add'> if (plugin.normalize) {</span> <span class='diff-add'> name = plugin.normalize(name, function (name) {</span> <span class='diff-add'> return normalize(name, parentName, true);</span> <span class='diff-add'> }) || '';</span> <span class='diff-add'> }</span> <span class='diff-add'> //prefix and name should already be normalized, no need</span> <span class='diff-add'> //for applying map config again either.</span> <span class='diff-add'> normalizedMap = makeModuleMap(map.prefix + '!' + name,</span> <span class='diff-add'> this.map.parentMap);</span> <span class='diff-add'> on(normalizedMap,</span> <span class='diff-add'> 'defined', bind(this, function (value) {</span> <span class='diff-add'> this.init([], function () { return value; }, null, {</span> <span class='diff-add'> enabled: true,</span> <span class='diff-add'> ignore: true</span> <span class='diff-add'> });</span> <span class='diff-add'> }));</span> <span class='diff-add'> normalizedMod = getOwn(registry, normalizedMap.id);</span> <span class='diff-add'> if (normalizedMod) {</span> <span class='diff-add'> //Mark this as a dependency for this plugin, so it</span> <span class='diff-add'> //can be traced for cycles.</span> <span class='diff-add'> this.depMaps.push(normalizedMap);</span> <span class='diff-add'> if (this.events.error) {</span> <span class='diff-add'> normalizedMod.on('error', bind(this, function (err) {</span> <span class='diff-add'> this.emit('error', err);</span> <span class='diff-add'> }));</span> <span class='diff-add'> }</span> <span class='diff-add'> normalizedMod.enable();</span> <span class='diff-add'> }</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> //If a paths config, then just load that file instead to</span> <span class='diff-add'> //resolve the plugin, as it is built into that paths layer.</span> <span class='diff-add'> if (bundleId) {</span> <span class='diff-add'> this.map.url = context.nameToUrl(bundleId);</span> <span class='diff-add'> this.load();</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> load = bind(this, function (value) {</span> <span class='diff-add'> this.init([], function () { return value; }, null, {</span> <span class='diff-add'> enabled: true</span> <span class='diff-add'> });</span> <span class='diff-add'> });</span> <span class='diff-add'> load.error = bind(this, function (err) {</span> <span class='diff-add'> this.inited = true;</span> <span class='diff-add'> this.error = err;</span> <span class='diff-add'> err.requireModules = [id];</span> <span class='diff-add'> //Remove temp unnormalized modules for this module,</span> <span class='diff-add'> //since they will never be resolved otherwise now.</span> <span class='diff-add'> eachProp(registry, function (mod) {</span> <span class='diff-add'> if (mod.map.id.indexOf(id + '_unnormalized') === 0) {</span> <span class='diff-add'> cleanRegistry(mod.map.id);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> onError(err);</span> <span class='diff-add'> });</span> <span class='diff-add'> //Allow plugins to load other code without having to know the</span> <span class='diff-add'> //context or how to 'complete' the load.</span> <span class='diff-add'> load.fromText = bind(this, function (text, textAlt) {</span> <span class='diff-add'> /*jslint evil: true */</span> <span class='diff-add'> var moduleName = map.name,</span> <span class='diff-add'> moduleMap = makeModuleMap(moduleName),</span> <span class='diff-add'> hasInteractive = useInteractive;</span> <span class='diff-add'> //As of 2.1.0, support just passing the text, to reinforce</span> <span class='diff-add'> //fromText only being called once per resource. Still</span> <span class='diff-add'> //support old style of passing moduleName but discard</span> <span class='diff-add'> //that moduleName in favor of the internal ref.</span> <span class='diff-add'> if (textAlt) {</span> <span class='diff-add'> text = textAlt;</span> <span class='diff-add'> }</span> <span class='diff-add'> //Turn off interactive script matching for IE for any define</span> <span class='diff-add'> //calls in the text, then turn it back on at the end.</span> <span class='diff-add'> if (hasInteractive) {</span> <span class='diff-add'> useInteractive = false;</span> <span class='diff-add'> }</span> <span class='diff-add'> //Prime the system by creating a module instance for</span> <span class='diff-add'> //it.</span> <span class='diff-add'> getModule(moduleMap);</span> <span class='diff-add'> //Transfer any config to this other module.</span> <span class='diff-add'> if (hasProp(config.config, id)) {</span> <span class='diff-add'> config.config[moduleName] = config.config[id];</span> <span class='diff-add'> }</span> <span class='diff-add'> try {</span> <span class='diff-add'> req.exec(text);</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> return onError(makeError('fromtexteval',</span> <span class='diff-add'> 'fromText eval for ' + id +</span> <span class='diff-add'> ' failed: ' + e,</span> <span class='diff-add'> e,</span> <span class='diff-add'> [id]));</span> <span class='diff-add'> }</span> <span class='diff-add'> if (hasInteractive) {</span> <span class='diff-add'> useInteractive = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> //Mark this as a dependency for the plugin</span> <span class='diff-add'> //resource</span> <span class='diff-add'> this.depMaps.push(moduleMap);</span> <span class='diff-add'> //Support anonymous modules.</span> <span class='diff-add'> context.completeLoad(moduleName);</span> <span class='diff-add'> //Bind the value of that module to the value for this</span> <span class='diff-add'> //resource ID.</span> <span class='diff-add'> localRequire([moduleName], load);</span> <span class='diff-add'> });</span> <span class='diff-add'> //Use parentName here since the plugin's name is not reliable,</span> <span class='diff-add'> //could be some weird string with no path that actually wants to</span> <span class='diff-add'> //reference the parentName's path.</span> <span class='diff-add'> plugin.load(map.name, localRequire, load, config);</span> <span class='diff-add'> }));</span> <span class='diff-add'> context.enable(pluginMap, this);</span> <span class='diff-add'> this.pluginMaps[pluginMap.id] = pluginMap;</span> <span class='diff-add'> },</span> <span class='diff-add'> enable: function () {</span> <span class='diff-add'> enabledRegistry[this.map.id] = this;</span> <span class='diff-add'> this.enabled = true;</span> <span class='diff-add'> //Set flag mentioning that the module is enabling,</span> <span class='diff-add'> //so that immediate calls to the defined callbacks</span> <span class='diff-add'> //for dependencies do not trigger inadvertent load</span> <span class='diff-add'> //with the depCount still being zero.</span> <span class='diff-add'> this.enabling = true;</span> <span class='diff-add'> //Enable each dependency</span> <span class='diff-add'> each(this.depMaps, bind(this, function (depMap, i) {</span> <span class='diff-add'> var id, mod, handler;</span> <span class='diff-add'> if (typeof depMap === 'string') {</span> <span class='diff-add'> //Dependency needs to be converted to a depMap</span> <span class='diff-add'> //and wired up to this module.</span> <span class='diff-add'> depMap = makeModuleMap(depMap,</span> <span class='diff-add'> (this.map.isDefine ? this.map : this.map.parentMap),</span> <span class='diff-add'> false,</span> <span class='diff-add'> !this.skipMap);</span> <span class='diff-add'> this.depMaps[i] = depMap;</span> <span class='diff-add'> handler = getOwn(handlers, depMap.id);</span> <span class='diff-add'> if (handler) {</span> <span class='diff-add'> this.depExports[i] = handler(this);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.depCount += 1;</span> <span class='diff-add'> on(depMap, 'defined', bind(this, function (depExports) {</span> <span class='diff-add'> this.defineDep(i, depExports);</span> <span class='diff-add'> this.check();</span> <span class='diff-add'> }));</span> <span class='diff-add'> if (this.errback) {</span> <span class='diff-add'> on(depMap, 'error', bind(this, this.errback));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> id = depMap.id;</span> <span class='diff-add'> mod = registry[id];</span> <span class='diff-add'> //Skip special modules like 'require', 'exports', 'module'</span> <span class='diff-add'> //Also, don't call enable if it is already enabled,</span> <span class='diff-add'> //important in circular dependency cases.</span> <span class='diff-add'> if (!hasProp(handlers, id) && mod && !mod.enabled) {</span> <span class='diff-add'> context.enable(depMap, this);</span> <span class='diff-add'> }</span> <span class='diff-add'> }));</span> <span class='diff-add'> //Enable each plugin that is used in</span> <span class='diff-add'> //a dependency</span> <span class='diff-add'> eachProp(this.pluginMaps, bind(this, function (pluginMap) {</span> <span class='diff-add'> var mod = getOwn(registry, pluginMap.id);</span> <span class='diff-add'> if (mod && !mod.enabled) {</span> <span class='diff-add'> context.enable(pluginMap, this);</span> <span class='diff-add'> }</span> <span class='diff-add'> }));</span> <span class='diff-add'> this.enabling = false;</span> <span class='diff-add'> this.check();</span> <span class='diff-add'> },</span> <span class='diff-add'> on: function (name, cb) {</span> <span class='diff-add'> var cbs = this.events[name];</span> <span class='diff-add'> if (!cbs) {</span> <span class='diff-add'> cbs = this.events[name] = [];</span> <span class='diff-add'> }</span> <span class='diff-add'> cbs.push(cb);</span> <span class='diff-add'> },</span> <span class='diff-add'> emit: function (name, evt) {</span> <span class='diff-add'> each(this.events[name], function (cb) {</span> <span class='diff-add'> cb(evt);</span> <span class='diff-add'> });</span> <span class='diff-add'> if (name === 'error') {</span> <span class='diff-add'> //Now that the error handler was triggered, remove</span> <span class='diff-add'> //the listeners, since this broken Module instance</span> <span class='diff-add'> //can stay around for a while in the registry.</span> <span class='diff-add'> delete this.events[name];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> function callGetModule(args) {</span> <span class='diff-add'> //Skip modules already defined.</span> <span class='diff-add'> if (!hasProp(defined, args[0])) {</span> <span class='diff-add'> getModule(makeModuleMap(args[0], null, true)).init(args[1], args[2]);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function removeListener(node, func, name, ieName) {</span> <span class='diff-add'> //Favor detachEvent because of IE9</span> <span class='diff-add'> //issue, see attachEvent/addEventListener comment elsewhere</span> <span class='diff-add'> //in this file.</span> <span class='diff-add'> if (node.detachEvent && !isOpera) {</span> <span class='diff-add'> //Probably IE. If not it will throw an error, which will be</span> <span class='diff-add'> //useful to know.</span> <span class='diff-add'> if (ieName) {</span> <span class='diff-add'> node.detachEvent(ieName, func);</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> node.removeEventListener(name, func, false);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Given an event from a script node, get the requirejs info from it,</span> <span class='diff-add'> * and then removes the event listeners on the node.</span> <span class='diff-add'> * @param {Event} evt</span> <span class='diff-add'> * @returns {Object}</span> <span class='diff-add'> */</span> <span class='diff-add'> function getScriptData(evt) {</span> <span class='diff-add'> //Using currentTarget instead of target for Firefox 2.0's sake. Not</span> <span class='diff-add'> //all old browsers will be supported, but this one was easy enough</span> <span class='diff-add'> //to support and still makes sense.</span> <span class='diff-add'> var node = evt.currentTarget || evt.srcElement;</span> <span class='diff-add'> //Remove the listeners once here.</span> <span class='diff-add'> removeListener(node, context.onScriptLoad, 'load', 'onreadystatechange');</span> <span class='diff-add'> removeListener(node, context.onScriptError, 'error');</span> <span class='diff-add'> return {</span> <span class='diff-add'> node: node,</span> <span class='diff-add'> id: node && node.getAttribute('data-requiremodule')</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> function intakeDefines() {</span> <span class='diff-add'> var args;</span> <span class='diff-add'> //Any defined modules in the global queue, intake them now.</span> <span class='diff-add'> takeGlobalQueue();</span> <span class='diff-add'> //Make sure any remaining defQueue items get properly processed.</span> <span class='diff-add'> while (defQueue.length) {</span> <span class='diff-add'> args = defQueue.shift();</span> <span class='diff-add'> if (args[0] === null) {</span> <span class='diff-add'> return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1]));</span> <span class='diff-add'> } else {</span> <span class='diff-add'> //args are id, deps, factory. Should be normalized by the</span> <span class='diff-add'> //define() function.</span> <span class='diff-add'> callGetModule(args);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> context = {</span> <span class='diff-add'> config: config,</span> <span class='diff-add'> contextName: contextName,</span> <span class='diff-add'> registry: registry,</span> <span class='diff-add'> defined: defined,</span> <span class='diff-add'> urlFetched: urlFetched,</span> <span class='diff-add'> defQueue: defQueue,</span> <span class='diff-add'> Module: Module,</span> <span class='diff-add'> makeModuleMap: makeModuleMap,</span> <span class='diff-add'> nextTick: req.nextTick,</span> <span class='diff-add'> onError: onError,</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a configuration for the context.</span> <span class='diff-add'> * @param {Object} cfg config object to integrate.</span> <span class='diff-add'> */</span> <span class='diff-add'> configure: function (cfg) {</span> <span class='diff-add'> //Make sure the baseUrl ends in a slash.</span> <span class='diff-add'> if (cfg.baseUrl) {</span> <span class='diff-add'> if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== '/') {</span> <span class='diff-add'> cfg.baseUrl += '/';</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> //Save off the paths since they require special processing,</span> <span class='diff-add'> //they are additive.</span> <span class='diff-add'> var shim = config.shim,</span> <span class='diff-add'> objs = {</span> <span class='diff-add'> paths: true,</span> <span class='diff-add'> bundles: true,</span> <span class='diff-add'> config: true,</span> <span class='diff-add'> map: true</span> <span class='diff-add'> };</span> <span class='diff-add'> eachProp(cfg, function (value, prop) {</span> <span class='diff-add'> if (objs[prop]) {</span> <span class='diff-add'> if (!config[prop]) {</span> <span class='diff-add'> config[prop] = {};</span> <span class='diff-add'> }</span> <span class='diff-add'> mixin(config[prop], value, true, true);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> config[prop] = value;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> //Reverse map the bundles</span> <span class='diff-add'> if (cfg.bundles) {</span> <span class='diff-add'> eachProp(cfg.bundles, function (value, prop) {</span> <span class='diff-add'> each(value, function (v) {</span> <span class='diff-add'> if (v !== prop) {</span> <span class='diff-add'> bundlesMap[v] = prop;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> //Merge shim</span> <span class='diff-add'> if (cfg.shim) {</span> <span class='diff-add'> eachProp(cfg.shim, function (value, id) {</span> <span class='diff-add'> //Normalize the structure</span> <span class='diff-add'> if (isArray(value)) {</span> <span class='diff-add'> value = {</span> <span class='diff-add'> deps: value</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> if ((value.exports || value.init) && !value.exportsFn) {</span> <span class='diff-add'> value.exportsFn = context.makeShimExports(value);</span> <span class='diff-add'> }</span> <span class='diff-add'> shim[id] = value;</span> <span class='diff-add'> });</span> <span class='diff-add'> config.shim = shim;</span> <span class='diff-add'> }</span> <span class='diff-add'> //Adjust packages if necessary.</span> <span class='diff-add'> if (cfg.packages) {</span> <span class='diff-add'> each(cfg.packages, function (pkgObj) {</span> <span class='diff-add'> var location, name;</span> <span class='diff-add'> pkgObj = typeof pkgObj === 'string' ? { name: pkgObj } : pkgObj;</span> <span class='diff-add'> name = pkgObj.name;</span> <span class='diff-add'> location = pkgObj.location;</span> <span class='diff-add'> if (location) {</span> <span class='diff-add'> config.paths[name] = pkgObj.location;</span> <span class='diff-add'> }</span> <span class='diff-add'> //Save pointer to main module ID for pkg name.</span> <span class='diff-add'> //Remove leading dot in main, so main paths are normalized,</span> <span class='diff-add'> //and remove any trailing .js, since different package</span> <span class='diff-add'> //envs have different conventions: some use a module name,</span> <span class='diff-add'> //some use a file name.</span> <span class='diff-add'> config.pkgs[name] = pkgObj.name + '/' + (pkgObj.main || 'main')</span> <span class='diff-add'> .replace(currDirRegExp, '')</span> <span class='diff-add'> .replace(jsSuffixRegExp, '');</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> //If there are any "waiting to execute" modules in the registry,</span> <span class='diff-add'> //update the maps for them, since their info, like URLs to load,</span> <span class='diff-add'> //may have changed.</span> <span class='diff-add'> eachProp(registry, function (mod, id) {</span> <span class='diff-add'> //If module already has init called, since it is too</span> <span class='diff-add'> //late to modify them, and ignore unnormalized ones</span> <span class='diff-add'> //since they are transient.</span> <span class='diff-add'> if (!mod.inited && !mod.map.unnormalized) {</span> <span class='diff-add'> mod.map = makeModuleMap(id);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> //If a deps array or a config callback is specified, then call</span> <span class='diff-add'> //require with those args. This is useful when require is defined as a</span> <span class='diff-add'> //config object before require.js is loaded.</span> <span class='diff-add'> if (cfg.deps || cfg.callback) {</span> <span class='diff-add'> context.require(cfg.deps || [], cfg.callback);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> makeShimExports: function (value) {</span> <span class='diff-add'> function fn() {</span> <span class='diff-add'> var ret;</span> <span class='diff-add'> if (value.init) {</span> <span class='diff-add'> ret = value.init.apply(global, arguments);</span> <span class='diff-add'> }</span> <span class='diff-add'> return ret || (value.exports && getGlobal(value.exports));</span> <span class='diff-add'> }</span> <span class='diff-add'> return fn;</span> <span class='diff-add'> },</span> <span class='diff-add'> makeRequire: function (relMap, options) {</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> function localRequire(deps, callback, errback) {</span> <span class='diff-add'> var id, map, requireMod;</span> <span class='diff-add'> if (options.enableBuildCallback && callback && isFunction(callback)) {</span> <span class='diff-add'> callback.__requireJsBuild = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (typeof deps === 'string') {</span> <span class='diff-add'> if (isFunction(callback)) {</span> <span class='diff-add'> //Invalid call</span> <span class='diff-add'> return onError(makeError('requireargs', 'Invalid require call'), errback);</span> <span class='diff-add'> }</span> <span class='diff-add'> //If require|exports|module are requested, get the</span> <span class='diff-add'> //value for them from the special handlers. Caveat:</span> <span class='diff-add'> //this only works while module is being defined.</span> <span class='diff-add'> if (relMap && hasProp(handlers, deps)) {</span> <span class='diff-add'> return handlers[deps](registry[relMap.id]);</span> <span class='diff-add'> }</span> <span class='diff-add'> //Synchronous access to one module. If require.get is</span> <span class='diff-add'> //available (as in the Node adapter), prefer that.</span> <span class='diff-add'> if (req.get) {</span> <span class='diff-add'> return req.get(context, deps, relMap, localRequire);</span> <span class='diff-add'> }</span> <span class='diff-add'> //Normalize module name, if it contains . or ..</span> <span class='diff-add'> map = makeModuleMap(deps, relMap, false, true);</span> <span class='diff-add'> id = map.id;</span> <span class='diff-add'> if (!hasProp(defined, id)) {</span> <span class='diff-add'> return onError(makeError('notloaded', 'Module name "' +</span> <span class='diff-add'> id +</span> <span class='diff-add'> '" has not been loaded yet for context: ' +</span> <span class='diff-add'> contextName +</span> <span class='diff-add'> (relMap ? '' : '. Use require([])')));</span> <span class='diff-add'> }</span> <span class='diff-add'> return defined[id];</span> <span class='diff-add'> }</span> <span class='diff-add'> //Grab defines waiting in the global queue.</span> <span class='diff-add'> intakeDefines();</span> <span class='diff-add'> //Mark all the dependencies as needing to be loaded.</span> <span class='diff-add'> context.nextTick(function () {</span> <span class='diff-add'> //Some defines could have been added since the</span> <span class='diff-add'> //require call, collect them.</span> <span class='diff-add'> intakeDefines();</span> <span class='diff-add'> requireMod = getModule(makeModuleMap(null, relMap));</span> <span class='diff-add'> //Store if map config should be applied to this require</span> <span class='diff-add'> //call for dependencies.</span> <span class='diff-add'> requireMod.skipMap = options.skipMap;</span> <span class='diff-add'> requireMod.init(deps, callback, errback, {</span> <span class='diff-add'> enabled: true</span> <span class='diff-add'> });</span> <span class='diff-add'> checkLoaded();</span> <span class='diff-add'> });</span> <span class='diff-add'> return localRequire;</span> <span class='diff-add'> }</span> <span class='diff-add'> mixin(localRequire, {</span> <span class='diff-add'> isBrowser: isBrowser,</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Converts a module name + .extension into an URL path.</span> <span class='diff-add'> * *Requires* the use of a module name. It does not support using</span> <span class='diff-add'> * plain URLs like nameToUrl.</span> <span class='diff-add'> */</span> <span class='diff-add'> toUrl: function (moduleNamePlusExt) {</span> <span class='diff-add'> var ext,</span> <span class='diff-add'> index = moduleNamePlusExt.lastIndexOf('.'),</span> <span class='diff-add'> segment = moduleNamePlusExt.split('/')[0],</span> <span class='diff-add'> isRelative = segment === '.' || segment === '..';</span> <span class='diff-add'> //Have a file extension alias, and it is not the</span> <span class='diff-add'> //dots from a relative path.</span> <span class='diff-add'> if (index !== -1 && (!isRelative || index > 1)) {</span> <span class='diff-add'> ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length);</span> <span class='diff-add'> moduleNamePlusExt = moduleNamePlusExt.substring(0, index);</span> <span class='diff-add'> }</span> <span class='diff-add'> return context.nameToUrl(normalize(moduleNamePlusExt,</span> <span class='diff-add'> relMap && relMap.id, true), ext, true);</span> <span class='diff-add'> },</span> <span class='diff-add'> defined: function (id) {</span> <span class='diff-add'> return hasProp(defined, makeModuleMap(id, relMap, false, true).id);</span> <span class='diff-add'> },</span> <span class='diff-add'> specified: function (id) {</span> <span class='diff-add'> id = makeModuleMap(id, relMap, false, true).id;</span> <span class='diff-add'> return hasProp(defined, id) || hasProp(registry, id);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> //Only allow undef on top level require calls</span> <span class='diff-add'> if (!relMap) {</span> <span class='diff-add'> localRequire.undef = function (id) {</span> <span class='diff-add'> //Bind any waiting define() calls to this context,</span> <span class='diff-add'> //fix for #408</span> <span class='diff-add'> takeGlobalQueue();</span> <span class='diff-add'> var map = makeModuleMap(id, relMap, true),</span> <span class='diff-add'> mod = getOwn(registry, id);</span> <span class='diff-add'> removeScript(id);</span> <span class='diff-add'> delete defined[id];</span> <span class='diff-add'> delete urlFetched[map.url];</span> <span class='diff-add'> delete undefEvents[id];</span> <span class='diff-add'> //Clean queued defines too. Go backwards</span> <span class='diff-add'> //in array so that the splices do not</span> <span class='diff-add'> //mess up the iteration.</span> <span class='diff-add'> eachReverse(defQueue, function(args, i) {</span> <span class='diff-add'> if(args[0] === id) {</span> <span class='diff-add'> defQueue.splice(i, 1);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> if (mod) {</span> <span class='diff-add'> //Hold on to listeners in case the</span> <span class='diff-add'> //module will be attempted to be reloaded</span> <span class='diff-add'> //using a different config.</span> <span class='diff-add'> if (mod.events.defined) {</span> <span class='diff-add'> undefEvents[id] = mod.events;</span> <span class='diff-add'> }</span> <span class='diff-add'> cleanRegistry(id);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> return localRequire;</span> <span class='diff-add'> },</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called to enable a module if it is still in the registry</span> <span class='diff-add'> * awaiting enablement. A second arg, parent, the parent module,</span> <span class='diff-add'> * is passed in for context, when this method is overridden by</span> <span class='diff-add'> * the optimizer. Not shown here to keep code compact.</span> <span class='diff-add'> */</span> <span class='diff-add'> enable: function (depMap) {</span> <span class='diff-add'> var mod = getOwn(registry, depMap.id);</span> <span class='diff-add'> if (mod) {</span> <span class='diff-add'> getModule(depMap).enable();</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Internal method used by environment adapters to complete a load event.</span> <span class='diff-add'> * A load event could be a script load or just a load pass from a synchronous</span> <span class='diff-add'> * load call.</span> <span class='diff-add'> * @param {String} moduleName the name of the module to potentially complete.</span> <span class='diff-add'> */</span> <span class='diff-add'> completeLoad: function (moduleName) {</span> <span class='diff-add'> var found, args, mod,</span> <span class='diff-add'> shim = getOwn(config.shim, moduleName) || {},</span> <span class='diff-add'> shExports = shim.exports;</span> <span class='diff-add'> takeGlobalQueue();</span> <span class='diff-add'> while (defQueue.length) {</span> <span class='diff-add'> args = defQueue.shift();</span> <span class='diff-add'> if (args[0] === null) {</span> <span class='diff-add'> args[0] = moduleName;</span> <span class='diff-add'> //If already found an anonymous module and bound it</span> <span class='diff-add'> //to this name, then this is some other anon module</span> <span class='diff-add'> //waiting for its completeLoad to fire.</span> <span class='diff-add'> if (found) {</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> found = true;</span> <span class='diff-add'> } else if (args[0] === moduleName) {</span> <span class='diff-add'> //Found matching define call for this script!</span> <span class='diff-add'> found = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> callGetModule(args);</span> <span class='diff-add'> }</span> <span class='diff-add'> //Do this after the cycle of callGetModule in case the result</span> <span class='diff-add'> //of those calls/init calls changes the registry.</span> <span class='diff-add'> mod = getOwn(registry, moduleName);</span> <span class='diff-add'> if (!found && !hasProp(defined, moduleName) && mod && !mod.inited) {</span> <span class='diff-add'> if (config.enforceDefine && (!shExports || !getGlobal(shExports))) {</span> <span class='diff-add'> if (hasPathFallback(moduleName)) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return onError(makeError('nodefine',</span> <span class='diff-add'> 'No define call for ' + moduleName,</span> <span class='diff-add'> null,</span> <span class='diff-add'> [moduleName]));</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> //A script that does not call define(), so just simulate</span> <span class='diff-add'> //the call for it.</span> <span class='diff-add'> callGetModule([moduleName, (shim.deps || []), shim.exportsFn]);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> checkLoaded();</span> <span class='diff-add'> },</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Converts a module name to a file path. Supports cases where</span> <span class='diff-add'> * moduleName may actually be just an URL.</span> <span class='diff-add'> * Note that it **does not** call normalize on the moduleName,</span> <span class='diff-add'> * it is assumed to have already been normalized. This is an</span> <span class='diff-add'> * internal API, not a public one. Use toUrl for the public API.</span> <span class='diff-add'> */</span> <span class='diff-add'> nameToUrl: function (moduleName, ext, skipExt) {</span> <span class='diff-add'> var paths, syms, i, parentModule, url,</span> <span class='diff-add'> parentPath, bundleId,</span> <span class='diff-add'> pkgMain = getOwn(config.pkgs, moduleName);</span> <span class='diff-add'> if (pkgMain) {</span> <span class='diff-add'> moduleName = pkgMain;</span> <span class='diff-add'> }</span> <span class='diff-add'> bundleId = getOwn(bundlesMap, moduleName);</span> <span class='diff-add'> if (bundleId) {</span> <span class='diff-add'> return context.nameToUrl(bundleId, ext, skipExt);</span> <span class='diff-add'> }</span> <span class='diff-add'> //If a colon is in the URL, it indicates a protocol is used and it is just</span> <span class='diff-add'> //an URL to a file, or if it starts with a slash, contains a query arg (i.e. ?)</span> <span class='diff-add'> //or ends with .js, then assume the user meant to use an url and not a module id.</span> <span class='diff-add'> //The slash is important for protocol-less URLs as well as full paths.</span> <span class='diff-add'> if (req.jsExtRegExp.test(moduleName)) {</span> <span class='diff-add'> //Just a plain path, not module name lookup, so just return it.</span> <span class='diff-add'> //Add extension if it is included. This is a bit wonky, only non-.js things pass</span> <span class='diff-add'> //an extension, this method probably needs to be reworked.</span> <span class='diff-add'> url = moduleName + (ext || '');</span> <span class='diff-add'> } else {</span> <span class='diff-add'> //A module that needs to be converted to a path.</span> <span class='diff-add'> paths = config.paths;</span> <span class='diff-add'> syms = moduleName.split('/');</span> <span class='diff-add'> //For each module name segment, see if there is a path</span> <span class='diff-add'> //registered for it. Start with most specific name</span> <span class='diff-add'> //and work up from it.</span> <span class='diff-add'> for (i = syms.length; i > 0; i -= 1) {</span> <span class='diff-add'> parentModule = syms.slice(0, i).join('/');</span> <span class='diff-add'> parentPath = getOwn(paths, parentModule);</span> <span class='diff-add'> if (parentPath) {</span> <span class='diff-add'> //If an array, it means there are a few choices,</span> <span class='diff-add'> //Choose the one that is desired</span> <span class='diff-add'> if (isArray(parentPath)) {</span> <span class='diff-add'> parentPath = parentPath[0];</span> <span class='diff-add'> }</span> <span class='diff-add'> syms.splice(0, i, parentPath);</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> //Join the path parts together, then figure out if baseUrl is needed.</span> <span class='diff-add'> url = syms.join('/');</span> <span class='diff-add'> url += (ext || (/^data\:|\?/.test(url) || skipExt ? '' : '.js'));</span> <span class='diff-add'> url = (url.charAt(0) === '/' || url.match(/^[\w\+\.\-]+:/) ? '' : config.baseUrl) + url;</span> <span class='diff-add'> }</span> <span class='diff-add'> return config.urlArgs ? url +</span> <span class='diff-add'> ((url.indexOf('?') === -1 ? '?' : '&') +</span> <span class='diff-add'> config.urlArgs) : url;</span> <span class='diff-add'> },</span> <span class='diff-add'> //Delegates to req.load. Broken out as a separate function to</span> <span class='diff-add'> //allow overriding in the optimizer.</span> <span class='diff-add'> load: function (id, url) {</span> <span class='diff-add'> req.load(context, id, url);</span> <span class='diff-add'> },</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Executes a module callback function. Broken out as a separate function</span> <span class='diff-add'> * solely to allow the build system to sequence the files in the built</span> <span class='diff-add'> * layer in the right sequence.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @private</span> <span class='diff-add'> */</span> <span class='diff-add'> execCb: function (name, callback, args, exports) {</span> <span class='diff-add'> return callback.apply(exports, args);</span> <span class='diff-add'> },</span> <span class='diff-add'> /**</span> <span class='diff-add'> * callback for script loads, used to check status of loading.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @param {Event} evt the event from the browser for the script</span> <span class='diff-add'> * that was loaded.</span> <span class='diff-add'> */</span> <span class='diff-add'> onScriptLoad: function (evt) {</span> <span class='diff-add'> //Using currentTarget instead of target for Firefox 2.0's sake. Not</span> <span class='diff-add'> //all old browsers will be supported, but this one was easy enough</span> <span class='diff-add'> //to support and still makes sense.</span> <span class='diff-add'> if (evt.type === 'load' ||</span> <span class='diff-add'> (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) {</span> <span class='diff-add'> //Reset interactive script so a script node is not held onto for</span> <span class='diff-add'> //to long.</span> <span class='diff-add'> interactiveScript = null;</span> <span class='diff-add'> //Pull out the name of the module and the context.</span> <span class='diff-add'> var data = getScriptData(evt);</span> <span class='diff-add'> context.completeLoad(data.id);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Callback for script errors.</span> <span class='diff-add'> */</span> <span class='diff-add'> onScriptError: function (evt) {</span> <span class='diff-add'> var data = getScriptData(evt);</span> <span class='diff-add'> if (!hasPathFallback(data.id)) {</span> <span class='diff-add'> return onError(makeError('scripterror', 'Script error for: ' + data.id, evt, [data.id]));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> context.require = context.makeRequire();</span> <span class='diff-add'> return context;</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Main entry point.</span> <span class='diff-add'> *</span> <span class='diff-add'> * If the only argument to require is a string, then the module that</span> <span class='diff-add'> * is represented by that string is fetched for the appropriate context.</span> <span class='diff-add'> *</span> <span class='diff-add'> * If the first argument is an array, then it will be treated as an array</span> <span class='diff-add'> * of dependency string names to fetch. An optional function callback can</span> <span class='diff-add'> * be specified to execute when all of those dependencies are available.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Make a local req variable to help Caja compliance (it assumes things</span> <span class='diff-add'> * on a require that are not standardized), and to give a short</span> <span class='diff-add'> * name for minification/local scope use.</span> <span class='diff-add'> */</span> <span class='diff-add'> req = requirejs = function (deps, callback, errback, optional) {</span> <span class='diff-add'> //Find the right context, use default</span> <span class='diff-add'> var context, config,</span> <span class='diff-add'> contextName = defContextName;</span> <span class='diff-add'> // Determine if have config object in the call.</span> <span class='diff-add'> if (!isArray(deps) && typeof deps !== 'string') {</span> <span class='diff-add'> // deps is a config object</span> <span class='diff-add'> config = deps;</span> <span class='diff-add'> if (isArray(callback)) {</span> <span class='diff-add'> // Adjust args if there are dependencies</span> <span class='diff-add'> deps = callback;</span> <span class='diff-add'> callback = errback;</span> <span class='diff-add'> errback = optional;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> deps = [];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (config && config.context) {</span> <span class='diff-add'> contextName = config.context;</span> <span class='diff-add'> }</span> <span class='diff-add'> context = getOwn(contexts, contextName);</span> <span class='diff-add'> if (!context) {</span> <span class='diff-add'> context = contexts[contextName] = req.s.newContext(contextName);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (config) {</span> <span class='diff-add'> context.configure(config);</span> <span class='diff-add'> }</span> <span class='diff-add'> return context.require(deps, callback, errback);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Support require.config() to make it easier to cooperate with other</span> <span class='diff-add'> * AMD loaders on globally agreed names.</span> <span class='diff-add'> */</span> <span class='diff-add'> req.config = function (config) {</span> <span class='diff-add'> return req(config);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Execute something after the current tick</span> <span class='diff-add'> * of the event loop. Override for other envs</span> <span class='diff-add'> * that have a better solution than setTimeout.</span> <span class='diff-add'> * @param {Function} fn function to execute later.</span> <span class='diff-add'> */</span> <span class='diff-add'> req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {</span> <span class='diff-add'> setTimeout(fn, 4);</span> <span class='diff-add'> } : function (fn) { fn(); };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Export require as a global, but only if it does not already exist.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (!require) {</span> <span class='diff-add'> require = req;</span> <span class='diff-add'> }</span> <span class='diff-add'> req.version = version;</span> <span class='diff-add'> //Used to filter out dependencies that are already paths.</span> <span class='diff-add'> req.jsExtRegExp = /^\/|:|\?|\.js$/;</span> <span class='diff-add'> req.isBrowser = isBrowser;</span> <span class='diff-add'> s = req.s = {</span> <span class='diff-add'> contexts: contexts,</span> <span class='diff-add'> newContext: newContext</span> <span class='diff-add'> };</span> <span class='diff-add'> //Create default context.</span> <span class='diff-add'> req({});</span> <span class='diff-add'> //Exports some context-sensitive methods on global require.</span> <span class='diff-add'> each([</span> <span class='diff-add'> 'toUrl',</span> <span class='diff-add'> 'undef',</span> <span class='diff-add'> 'defined',</span> <span class='diff-add'> 'specified'</span> <span class='diff-add'> ], function (prop) {</span> <span class='diff-add'> //Reference from contexts instead of early binding to default context,</span> <span class='diff-add'> //so that during builds, the latest instance of the default context</span> <span class='diff-add'> //with its config gets used.</span> <span class='diff-add'> req[prop] = function () {</span> <span class='diff-add'> var ctx = contexts[defContextName];</span> <span class='diff-add'> return ctx.require[prop].apply(ctx, arguments);</span> <span class='diff-add'> };</span> <span class='diff-add'> });</span> <span class='diff-add'> if (isBrowser) {</span> <span class='diff-add'> head = s.head = document.getElementsByTagName('head')[0];</span> <span class='diff-add'> //If BASE tag is in play, using appendChild is a problem for IE6.</span> <span class='diff-add'> //When that browser dies, this can be removed. Details in this jQuery bug:</span> <span class='diff-add'> //http://dev.jquery.com/ticket/2709</span> <span class='diff-add'> baseElement = document.getElementsByTagName('base')[0];</span> <span class='diff-add'> if (baseElement) {</span> <span class='diff-add'> head = s.head = baseElement.parentNode;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Any errors that require explicitly generates will be passed to this</span> <span class='diff-add'> * function. Intercept/override it if you want custom error handling.</span> <span class='diff-add'> * @param {Error} err the error object.</span> <span class='diff-add'> */</span> <span class='diff-add'> req.onError = defaultOnError;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Creates the node for the load command. Only used in browser envs.</span> <span class='diff-add'> */</span> <span class='diff-add'> req.createNode = function (config, moduleName, url) {</span> <span class='diff-add'> var node = config.xhtml ?</span> <span class='diff-add'> document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') :</span> <span class='diff-add'> document.createElement('script');</span> <span class='diff-add'> node.type = config.scriptType || 'text/javascript';</span> <span class='diff-add'> node.charset = 'utf-8';</span> <span class='diff-add'> node.async = true;</span> <span class='diff-add'> return node;</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Does the request to load a module for the browser case.</span> <span class='diff-add'> * Make this a separate function to allow other environments</span> <span class='diff-add'> * to override it.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @param {Object} context the require context to find state.</span> <span class='diff-add'> * @param {String} moduleName the name of the module.</span> <span class='diff-add'> * @param {Object} url the URL to the module.</span> <span class='diff-add'> */</span> <span class='diff-add'> req.load = function (context, moduleName, url) {</span> <span class='diff-add'> var config = (context && context.config) || {},</span> <span class='diff-add'> node;</span> <span class='diff-add'> if (isBrowser) {</span> <span class='diff-add'> //In the browser so use a script tag</span> <span class='diff-add'> node = req.createNode(config, moduleName, url);</span> <span class='diff-add'> node.setAttribute('data-requirecontext', context.contextName);</span> <span class='diff-add'> node.setAttribute('data-requiremodule', moduleName);</span> <span class='diff-add'> //Set up load listener. Test attachEvent first because IE9 has</span> <span class='diff-add'> //a subtle issue in its addEventListener and script onload firings</span> <span class='diff-add'> //that do not match the behavior of all other browsers with</span> <span class='diff-add'> //addEventListener support, which fire the onload event for a</span> <span class='diff-add'> //script right after the script execution. See:</span> <span class='diff-add'> //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution</span> <span class='diff-add'> //UNFORTUNATELY Opera implements attachEvent but does not follow the script</span> <span class='diff-add'> //script execution mode.</span> <span class='diff-add'> if (node.attachEvent &&</span> <span class='diff-add'> //Check if node.attachEvent is artificially added by custom script or</span> <span class='diff-add'> //natively supported by browser</span> <span class='diff-add'> //read https://github.com/jrburke/requirejs/issues/187</span> <span class='diff-add'> //if we can NOT find [native code] then it must NOT natively supported.</span> <span class='diff-add'> //in IE8, node.attachEvent does not have toString()</span> <span class='diff-add'> //Note the test for "[native code" with no closing brace, see:</span> <span class='diff-add'> //https://github.com/jrburke/requirejs/issues/273</span> <span class='diff-add'> !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) &&</span> <span class='diff-add'> !isOpera) {</span> <span class='diff-add'> //Probably IE. IE (at least 6-8) do not fire</span> <span class='diff-add'> //script onload right after executing the script, so</span> <span class='diff-add'> //we cannot tie the anonymous define call to a name.</span> <span class='diff-add'> //However, IE reports the script as being in 'interactive'</span> <span class='diff-add'> //readyState at the time of the define call.</span> <span class='diff-add'> useInteractive = true;</span> <span class='diff-add'> node.attachEvent('onreadystatechange', context.onScriptLoad);</span> <span class='diff-add'> //It would be great to add an error handler here to catch</span> <span class='diff-add'> //404s in IE9+. However, onreadystatechange will fire before</span> <span class='diff-add'> //the error handler, so that does not help. If addEventListener</span> <span class='diff-add'> //is used, then IE will fire error before load, but we cannot</span> <span class='diff-add'> //use that pathway given the connect.microsoft.com issue</span> <span class='diff-add'> //mentioned above about not doing the 'script execute,</span> <span class='diff-add'> //then fire the script load event listener before execute</span> <span class='diff-add'> //next script' that other browsers do.</span> <span class='diff-add'> //Best hope: IE10 fixes the issues,</span> <span class='diff-add'> //and then destroys all installs of IE 6-9.</span> <span class='diff-add'> //node.attachEvent('onerror', context.onScriptError);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> node.addEventListener('load', context.onScriptLoad, false);</span> <span class='diff-add'> node.addEventListener('error', context.onScriptError, false);</span> <span class='diff-add'> }</span> <span class='diff-add'> node.src = url;</span> <span class='diff-add'> //For some cache cases in IE 6-8, the script executes before the end</span> <span class='diff-add'> //of the appendChild execution, so to tie an anonymous define</span> <span class='diff-add'> //call to the module name (which is stored on the node), hold on</span> <span class='diff-add'> //to a reference to this node, but clear after the DOM insertion.</span> <span class='diff-add'> currentlyAddingScript = node;</span> <span class='diff-add'> if (baseElement) {</span> <span class='diff-add'> head.insertBefore(node, baseElement);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> head.appendChild(node);</span> <span class='diff-add'> }</span> <span class='diff-add'> currentlyAddingScript = null;</span> <span class='diff-add'> return node;</span> <span class='diff-add'> } else if (isWebWorker) {</span> <span class='diff-add'> try {</span> <span class='diff-add'> //In a web worker, use importScripts. This is not a very</span> <span class='diff-add'> //efficient use of importScripts, importScripts will block until</span> <span class='diff-add'> //its script is downloaded and evaluated. However, if web workers</span> <span class='diff-add'> //are in play, the expectation that a build has been done so that</span> <span class='diff-add'> //only one script needs to be loaded anyway. This may need to be</span> <span class='diff-add'> //reevaluated if other use cases become common.</span> <span class='diff-add'> importScripts(url);</span> <span class='diff-add'> //Account for anonymous modules</span> <span class='diff-add'> context.completeLoad(moduleName);</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> context.onError(makeError('importscripts',</span> <span class='diff-add'> 'importScripts failed for ' +</span> <span class='diff-add'> moduleName + ' at ' + url,</span> <span class='diff-add'> e,</span> <span class='diff-add'> [moduleName]));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> function getInteractiveScript() {</span> <span class='diff-add'> if (interactiveScript && interactiveScript.readyState === 'interactive') {</span> <span class='diff-add'> return interactiveScript;</span> <span class='diff-add'> }</span> <span class='diff-add'> eachReverse(scripts(), function (script) {</span> <span class='diff-add'> if (script.readyState === 'interactive') {</span> <span class='diff-add'> return (interactiveScript = script);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> return interactiveScript;</span> <span class='diff-add'> }</span> <span class='diff-add'> //Look for a data-main script attribute, which could also adjust the baseUrl.</span> <span class='diff-add'> if (isBrowser && !cfg.skipDataMain) {</span> <span class='diff-add'> //Figure out baseUrl. Get it from the script tag with require.js in it.</span> <span class='diff-add'> eachReverse(scripts(), function (script) {</span> <span class='diff-add'> //Set the 'head' where we can append children by</span> <span class='diff-add'> //using the script's parent.</span> <span class='diff-add'> if (!head) {</span> <span class='diff-add'> head = script.parentNode;</span> <span class='diff-add'> }</span> <span class='diff-add'> //Look for a data-main attribute to set main script for the page</span> <span class='diff-add'> //to load. If it is there, the path to data main becomes the</span> <span class='diff-add'> //baseUrl, if it is not already set.</span> <span class='diff-add'> dataMain = script.getAttribute('data-main');</span> <span class='diff-add'> if (dataMain) {</span> <span class='diff-add'> //Preserve dataMain in case it is a path (i.e. contains '?')</span> <span class='diff-add'> mainScript = dataMain;</span> <span class='diff-add'> //Set final baseUrl if there is not already an explicit one.</span> <span class='diff-add'> if (!cfg.baseUrl) {</span> <span class='diff-add'> //Pull off the directory of data-main for use as the</span> <span class='diff-add'> //baseUrl.</span> <span class='diff-add'> src = mainScript.split('/');</span> <span class='diff-add'> mainScript = src.pop();</span> <span class='diff-add'> subPath = src.length ? src.join('/') + '/' : './';</span> <span class='diff-add'> cfg.baseUrl = subPath;</span> <span class='diff-add'> }</span> <span class='diff-add'> //Strip off any trailing .js since mainScript is now</span> <span class='diff-add'> //like a module name.</span> <span class='diff-add'> mainScript = mainScript.replace(jsSuffixRegExp, '');</span> <span class='diff-add'> //If mainScript is still a path, fall back to dataMain</span> <span class='diff-add'> if (req.jsExtRegExp.test(mainScript)) {</span> <span class='diff-add'> mainScript = dataMain;</span> <span class='diff-add'> }</span> <span class='diff-add'> //Put the data-main script in the files to load.</span> <span class='diff-add'> cfg.deps = cfg.deps ? cfg.deps.concat(mainScript) : [mainScript];</span> <span class='diff-add'> return true;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> /**</span> <span class='diff-add'> * The function that handles definitions of modules. Differs from</span> <span class='diff-add'> * require() in that a string for the module should be the first argument,</span> <span class='diff-add'> * and the function to execute after dependencies are loaded should</span> <span class='diff-add'> * return a value to define the module corresponding to the first argument's</span> <span class='diff-add'> * name.</span> <span class='diff-add'> */</span> <span class='diff-add'> define = function (name, deps, callback) {</span> <span class='diff-add'> var node, context;</span> <span class='diff-add'> //Allow for anonymous modules</span> <span class='diff-add'> if (typeof name !== 'string') {</span> <span class='diff-add'> //Adjust args appropriately</span> <span class='diff-add'> callback = deps;</span> <span class='diff-add'> deps = name;</span> <span class='diff-add'> name = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> //This module may not have dependencies</span> <span class='diff-add'> if (!isArray(deps)) {</span> <span class='diff-add'> callback = deps;</span> <span class='diff-add'> deps = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> //If no name, and callback is a function, then figure out if it a</span> <span class='diff-add'> //CommonJS thing with dependencies.</span> <span class='diff-add'> if (!deps && isFunction(callback)) {</span> <span class='diff-add'> deps = [];</span> <span class='diff-add'> //Remove comments from the callback string,</span> <span class='diff-add'> //look for require calls, and pull them into the dependencies,</span> <span class='diff-add'> //but only if there are function args.</span> <span class='diff-add'> if (callback.length) {</span> <span class='diff-add'> callback</span> <span class='diff-add'> .toString()</span> <span class='diff-add'> .replace(commentRegExp, '')</span> <span class='diff-add'> .replace(cjsRequireRegExp, function (match, dep) {</span> <span class='diff-add'> deps.push(dep);</span> <span class='diff-add'> });</span> <span class='diff-add'> //May be a CommonJS thing even without require calls, but still</span> <span class='diff-add'> //could use exports, and module. Avoid doing exports and module</span> <span class='diff-add'> //work though if it just needs require.</span> <span class='diff-add'> //REQUIRES the function to expect the CommonJS variables in the</span> <span class='diff-add'> //order listed below.</span> <span class='diff-add'> deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> //If in IE 6-8 and hit an anonymous define() call, do the interactive</span> <span class='diff-add'> //work.</span> <span class='diff-add'> if (useInteractive) {</span> <span class='diff-add'> node = currentlyAddingScript || getInteractiveScript();</span> <span class='diff-add'> if (node) {</span> <span class='diff-add'> if (!name) {</span> <span class='diff-add'> name = node.getAttribute('data-requiremodule');</span> <span class='diff-add'> }</span> <span class='diff-add'> context = contexts[node.getAttribute('data-requirecontext')];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> //Always save off evaluating the def call until the script onload handler.</span> <span class='diff-add'> //This allows multiple modules to be in a file without prematurely</span> <span class='diff-add'> //tracing dependencies, and allows for anonymous module support,</span> <span class='diff-add'> //where the module name is not known until the script onload event</span> <span class='diff-add'> //occurs. If no context, use the global queue, and get it processed</span> <span class='diff-add'> //in the onscript load callback.</span> <span class='diff-add'> (context ? context.defQueue : globalDefQueue).push([name, deps, callback]);</span> <span class='diff-add'> };</span> <span class='diff-add'> define.amd = {</span> <span class='diff-add'> jQuery: true</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Executes the text. Normally just uses eval, but can be modified</span> <span class='diff-add'> * to use a better, environment-specific call. Only used for transpiling</span> <span class='diff-add'> * loader plugins, not for plain JS modules.</span> <span class='diff-add'> * @param {String} text the text to execute/evaluate.</span> <span class='diff-add'> */</span> <span class='diff-add'> req.exec = function (text) {</span> <span class='diff-add'> /*jslint evil: true */</span> <span class='diff-add'> return eval(text);</span> <span class='diff-add'> };</span> <span class='diff-add'> //Set up with config info.</span> <span class='diff-add'> req(cfg);</span> <span class='diff-add'>}(this));</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/runmode.js b/ipynb/Array-feature-overlap-05_files/runmode.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..07d2279</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/runmode.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span> <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span> <span class='diff-add'>(function(mod) {</span> <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span> <span class='diff-add'> mod(require("../../lib/codemirror"));</span> <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span> <span class='diff-add'> define(["../../lib/codemirror"], mod);</span> <span class='diff-add'> else // Plain browser env</span> <span class='diff-add'> mod(CodeMirror);</span> <span class='diff-add'>})(function(CodeMirror) {</span> <span class='diff-add'>"use strict";</span> <span class='diff-add'>CodeMirror.runMode = function(string, modespec, callback, options) {</span> <span class='diff-add'> var mode = CodeMirror.getMode(CodeMirror.defaults, modespec);</span> <span class='diff-add'> var ie = /MSIE \d/.test(navigator.userAgent);</span> <span class='diff-add'> var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);</span> <span class='diff-add'> if (callback.nodeType == 1) {</span> <span class='diff-add'> var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize;</span> <span class='diff-add'> var node = callback, col = 0;</span> <span class='diff-add'> node.innerHTML = "";</span> <span class='diff-add'> callback = function(text, style) {</span> <span class='diff-add'> if (text == "\n") {</span> <span class='diff-add'> // Emitting LF or CRLF on IE8 or earlier results in an incorrect display.</span> <span class='diff-add'> // Emitting a carriage return makes everything ok.</span> <span class='diff-add'> node.appendChild(document.createTextNode(ie_lt9 ? '\r' : text));</span> <span class='diff-add'> col = 0;</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var content = "";</span> <span class='diff-add'> // replace tabs</span> <span class='diff-add'> for (var pos = 0;;) {</span> <span class='diff-add'> var idx = text.indexOf("\t", pos);</span> <span class='diff-add'> if (idx == -1) {</span> <span class='diff-add'> content += text.slice(pos);</span> <span class='diff-add'> col += text.length - pos;</span> <span class='diff-add'> break;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> col += idx - pos;</span> <span class='diff-add'> content += text.slice(pos, idx);</span> <span class='diff-add'> var size = tabSize - col % tabSize;</span> <span class='diff-add'> col += size;</span> <span class='diff-add'> for (var i = 0; i < size; ++i) content += " ";</span> <span class='diff-add'> pos = idx + 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (style) {</span> <span class='diff-add'> var sp = node.appendChild(document.createElement("span"));</span> <span class='diff-add'> sp.className = "cm-" + style.replace(/ +/g, " cm-");</span> <span class='diff-add'> sp.appendChild(document.createTextNode(content));</span> <span class='diff-add'> } else {</span> <span class='diff-add'> node.appendChild(document.createTextNode(content));</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode);</span> <span class='diff-add'> for (var i = 0, e = lines.length; i < e; ++i) {</span> <span class='diff-add'> if (i) callback("\n");</span> <span class='diff-add'> var stream = new CodeMirror.StringStream(lines[i]);</span> <span class='diff-add'> if (!stream.string && mode.blankLine) mode.blankLine(state);</span> <span class='diff-add'> while (!stream.eol()) {</span> <span class='diff-add'> var style = mode.token(stream, state);</span> <span class='diff-add'> callback(stream.current(), style, i, stream.start, state);</span> <span class='diff-add'> stream.start = stream.pos;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'>};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/savewidget.js b/ipynb/Array-feature-overlap-05_files/savewidget.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..d1c6f6e</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/savewidget.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> 'base/js/dialog',</span> <span class='diff-add'> 'base/js/keyboard',</span> <span class='diff-add'> 'moment',</span> <span class='diff-add'>], function(IPython, $, utils, dialog, keyboard, moment) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var SaveWidget = function (selector, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * TODO: Remove circular ref.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.notebook = undefined;</span> <span class='diff-add'> this.selector = selector;</span> <span class='diff-add'> this.events = options.events;</span> <span class='diff-add'> this._checkpoint_date = undefined;</span> <span class='diff-add'> this.keyboard_manager = options.keyboard_manager;</span> <span class='diff-add'> if (this.selector !== undefined) {</span> <span class='diff-add'> this.element = $(selector);</span> <span class='diff-add'> this.bind_events();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> SaveWidget.prototype.bind_events = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.element.find('span.filename').click(function () {</span> <span class='diff-add'> that.rename_notebook({notebook: that.notebook});</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('notebook_loaded.Notebook', function () {</span> <span class='diff-add'> that.update_notebook_name();</span> <span class='diff-add'> that.update_document_title();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('notebook_saved.Notebook', function () {</span> <span class='diff-add'> that.update_notebook_name();</span> <span class='diff-add'> that.update_document_title();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('notebook_renamed.Notebook', function () {</span> <span class='diff-add'> that.update_notebook_name();</span> <span class='diff-add'> that.update_document_title();</span> <span class='diff-add'> that.update_address_bar();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('notebook_save_failed.Notebook', function () {</span> <span class='diff-add'> that.set_save_status('Autosave Failed!');</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('notebook_read_only.Notebook', function () {</span> <span class='diff-add'> that.set_save_status('(read only)');</span> <span class='diff-add'> // disable future set_save_status</span> <span class='diff-add'> that.set_save_status = function () {};</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('checkpoints_listed.Notebook', function (event, data) {</span> <span class='diff-add'> that._set_last_checkpoint(data[0]);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('checkpoint_created.Notebook', function (event, data) {</span> <span class='diff-add'> that._set_last_checkpoint(data);</span> <span class='diff-add'> });</span> <span class='diff-add'> this.events.on('set_dirty.Notebook', function (event, data) {</span> <span class='diff-add'> that.set_autosaved(data.value);</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> SaveWidget.prototype.rename_notebook = function (options) {</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var dialog_body = $('<div/>').append(</span> <span class='diff-add'> $("<p/>").addClass("rename-message")</span> <span class='diff-add'> .text('Enter a new notebook name:')</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $("<br/>")</span> <span class='diff-add'> ).append(</span> <span class='diff-add'> $('<input/>').attr('type','text').attr('size','25').addClass('form-control')</span> <span class='diff-add'> .val(options.notebook.get_notebook_name())</span> <span class='diff-add'> );</span> <span class='diff-add'> var d = dialog.modal({</span> <span class='diff-add'> title: "Rename Notebook",</span> <span class='diff-add'> body: dialog_body,</span> <span class='diff-add'> notebook: options.notebook,</span> <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span> <span class='diff-add'> buttons : {</span> <span class='diff-add'> "OK": {</span> <span class='diff-add'> class: "btn-primary",</span> <span class='diff-add'> click: function () {</span> <span class='diff-add'> var new_name = d.find('input').val();</span> <span class='diff-add'> if (!options.notebook.test_notebook_name(new_name)) {</span> <span class='diff-add'> d.find('.rename-message').text(</span> <span class='diff-add'> "Invalid notebook name. Notebook names must "+</span> <span class='diff-add'> "have 1 or more characters and can contain any characters " +</span> <span class='diff-add'> "except :/\\. Please enter a new notebook name:"</span> <span class='diff-add'> );</span> <span class='diff-add'> return false;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> d.find('.rename-message').text("Renaming...");</span> <span class='diff-add'> d.find('input[type="text"]').prop('disabled', true);</span> <span class='diff-add'> that.notebook.rename(new_name).then(</span> <span class='diff-add'> function () {</span> <span class='diff-add'> d.modal('hide');</span> <span class='diff-add'> }, function (error) {</span> <span class='diff-add'> d.find('.rename-message').text(error.message || 'Unknown error');</span> <span class='diff-add'> d.find('input[type="text"]').prop('disabled', false).focus().select();</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> "Cancel": {}</span> <span class='diff-add'> },</span> <span class='diff-add'> open : function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Upon ENTER, click the OK button.</span> <span class='diff-add'> */</span> <span class='diff-add'> d.find('input[type="text"]').keydown(function (event) {</span> <span class='diff-add'> if (event.which === keyboard.keycodes.enter) {</span> <span class='diff-add'> d.find('.btn-primary').first().click();</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> d.find('input[type="text"]').focus().select();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> SaveWidget.prototype.update_notebook_name = function () {</span> <span class='diff-add'> var nbname = this.notebook.get_notebook_name();</span> <span class='diff-add'> this.element.find('span.filename').text(nbname);</span> <span class='diff-add'> };</span> <span class='diff-add'> SaveWidget.prototype.update_document_title = function () {</span> <span class='diff-add'> var nbname = this.notebook.get_notebook_name();</span> <span class='diff-add'> document.title = nbname;</span> <span class='diff-add'> };</span> <span class='diff-add'> SaveWidget.prototype.update_address_bar = function(){</span> <span class='diff-add'> var base_url = this.notebook.base_url;</span> <span class='diff-add'> var path = this.notebook.notebook_path;</span> <span class='diff-add'> var state = {path : path};</span> <span class='diff-add'> window.history.replaceState(state, "", utils.url_join_encode(</span> <span class='diff-add'> base_url,</span> <span class='diff-add'> "notebooks",</span> <span class='diff-add'> path)</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> SaveWidget.prototype.set_save_status = function (msg) {</span> <span class='diff-add'> this.element.find('span.autosave_status').text(msg);</span> <span class='diff-add'> };</span> <span class='diff-add'> SaveWidget.prototype._set_last_checkpoint = function (checkpoint) {</span> <span class='diff-add'> if (checkpoint) {</span> <span class='diff-add'> this._checkpoint_date = new Date(checkpoint.last_modified);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this._checkpoint_date = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> this._render_checkpoint();</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> SaveWidget.prototype._render_checkpoint = function () {</span> <span class='diff-add'> /** actually set the text in the element, from our _checkpoint value</span> <span class='diff-add'> </span> <span class='diff-add'> called directly, and periodically in timeouts.</span> <span class='diff-add'> */</span> <span class='diff-add'> this._schedule_render_checkpoint();</span> <span class='diff-add'> var el = this.element.find('span.checkpoint_status');</span> <span class='diff-add'> if (!this._checkpoint_date) {</span> <span class='diff-add'> el.text('').attr('title', 'no checkpoint');</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var chkd = moment(this._checkpoint_date);</span> <span class='diff-add'> var long_date = chkd.format('llll');</span> <span class='diff-add'> var human_date;</span> <span class='diff-add'> var tdelta = Math.ceil(new Date() - this._checkpoint_date);</span> <span class='diff-add'> if (tdelta < utils.time.milliseconds.d){</span> <span class='diff-add'> // less than 24 hours old, use relative date</span> <span class='diff-add'> human_date = chkd.fromNow();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // otherwise show calendar </span> <span class='diff-add'> // <Today | yesterday|...> at hh,mm,ss</span> <span class='diff-add'> human_date = chkd.calendar();</span> <span class='diff-add'> }</span> <span class='diff-add'> el.text('Last Checkpoint: ' + human_date).attr('title', long_date);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> SaveWidget.prototype._schedule_render_checkpoint = function () {</span> <span class='diff-add'> /** schedule the next update to relative date</span> <span class='diff-add'> </span> <span class='diff-add'> periodically updated, so short values like 'a few seconds ago' don't get stale.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (!this._checkpoint_date) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> if ((this._checkpoint_timeout)) {</span> <span class='diff-add'> clearTimeout(this._checkpoint_timeout);</span> <span class='diff-add'> }</span> <span class='diff-add'> var dt = Math.ceil(new Date() - this._checkpoint_date);</span> <span class='diff-add'> this._checkpoint_timeout = setTimeout(</span> <span class='diff-add'> $.proxy(this._render_checkpoint, this),</span> <span class='diff-add'> utils.time.timeout_from_dt(dt)</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> SaveWidget.prototype.set_autosaved = function (dirty) {</span> <span class='diff-add'> if (dirty) {</span> <span class='diff-add'> this.set_save_status("(unsaved changes)");</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.set_save_status("(autosaved)");</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatibility.</span> <span class='diff-add'> IPython.SaveWidget = SaveWidget;</span> <span class='diff-add'> return {'SaveWidget': SaveWidget};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/scrollmanager.js b/ipynb/Array-feature-overlap-05_files/scrollmanager.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..552b326</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/scrollmanager.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define(['jquery'], function($){</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var ScrollManager = function(notebook, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Public constructor.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.notebook = notebook;</span> <span class='diff-add'> this.element = $('#site');</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> this.animation_speed = options.animation_speed || 250; //ms</span> <span class='diff-add'> };</span> <span class='diff-add'> ScrollManager.prototype.scroll = function (delta) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Scroll the document.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters</span> <span class='diff-add'> * ----------</span> <span class='diff-add'> * delta: integer</span> <span class='diff-add'> * direction to scroll the document. Positive is downwards. </span> <span class='diff-add'> * Unit is one page length.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.scroll_some(delta);</span> <span class='diff-add'> return false;</span> <span class='diff-add'> };</span> <span class='diff-add'> ScrollManager.prototype.scroll_to = function(selector) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Scroll to an element in the notebook.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.element.animate({'scrollTop': $(selector).offset().top + this.element.scrollTop() - this.element.offset().top}, this.animation_speed);</span> <span class='diff-add'> };</span> <span class='diff-add'> ScrollManager.prototype.scroll_some = function(pages) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Scroll up or down a given number of pages.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters</span> <span class='diff-add'> * ----------</span> <span class='diff-add'> * pages: integer</span> <span class='diff-add'> * number of pages to scroll the document, may be positive or negative.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.element.animate({'scrollTop': this.element.scrollTop() + pages * this.element.height()}, this.animation_speed);</span> <span class='diff-add'> };</span> <span class='diff-add'> ScrollManager.prototype.get_first_visible_cell = function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Gets the index of the first visible cell in the document.</span> <span class='diff-add'> *</span> <span class='diff-add'> * First, attempt to be smart by guessing the index of the cell we are</span> <span class='diff-add'> * scrolled to. Then, walk from there up or down until the right cell </span> <span class='diff-add'> * is found. To guess the index, get the top of the last cell, and</span> <span class='diff-add'> * divide that by the number of cells to get an average cell height. </span> <span class='diff-add'> * Then divide the scroll height by the average cell height.</span> <span class='diff-add'> */</span> <span class='diff-add'> var cell_count = this.notebook.ncells();</span> <span class='diff-add'> var first_cell_top = this.notebook.get_cell(0).element.offset().top;</span> <span class='diff-add'> var last_cell_top = this.notebook.get_cell(cell_count-1).element.offset().top;</span> <span class='diff-add'> var avg_cell_height = (last_cell_top - first_cell_top) / cell_count;</span> <span class='diff-add'> var i = Math.ceil(this.element.scrollTop() / avg_cell_height);</span> <span class='diff-add'> i = Math.min(Math.max(i , 0), cell_count - 1);</span> <span class='diff-add'> while (this.notebook.get_cell(i).element.offset().top - first_cell_top < this.element.scrollTop() && i < cell_count - 1) {</span> <span class='diff-add'> i += 1;</span> <span class='diff-add'> } </span> <span class='diff-add'> while (this.notebook.get_cell(i).element.offset().top - first_cell_top > this.element.scrollTop() - 50 && i >= 0) {</span> <span class='diff-add'> i -= 1;</span> <span class='diff-add'> } </span> <span class='diff-add'> return Math.min(i + 1, cell_count - 1);</span> <span class='diff-add'> };</span> <span class='diff-add'> var TargetScrollManager = function(notebook, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Public constructor.</span> <span class='diff-add'> */</span> <span class='diff-add'> ScrollManager.apply(this, [notebook, options]);</span> <span class='diff-add'> };</span> <span class='diff-add'> TargetScrollManager.prototype = Object.create(ScrollManager.prototype);</span> <span class='diff-add'> TargetScrollManager.prototype.is_target = function (index) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Check if a cell should be a scroll stop.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Returns `true` if the cell is a cell that the scroll manager</span> <span class='diff-add'> * should scroll to. Otherwise, false is returned. </span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters</span> <span class='diff-add'> * ----------</span> <span class='diff-add'> * index: integer</span> <span class='diff-add'> * index of the cell to test.</span> <span class='diff-add'> */</span> <span class='diff-add'> return false;</span> <span class='diff-add'> };</span> <span class='diff-add'> TargetScrollManager.prototype.scroll = function (delta) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Scroll the document.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters</span> <span class='diff-add'> * ----------</span> <span class='diff-add'> * delta: integer</span> <span class='diff-add'> * direction to scroll the document. Positive is downwards.</span> <span class='diff-add'> * Units are targets.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Try to scroll to the next slide.</span> <span class='diff-add'> */</span> <span class='diff-add'> var cell_count = this.notebook.ncells();</span> <span class='diff-add'> var selected_index = this.get_first_visible_cell() + delta;</span> <span class='diff-add'> while (0 <= selected_index && selected_index < cell_count && !this.is_target(selected_index)) {</span> <span class='diff-add'> selected_index += delta;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (selected_index < 0 || cell_count <= selected_index) {</span> <span class='diff-add'> return ScrollManager.prototype.scroll.apply(this, [delta]);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.scroll_to(this.notebook.get_cell(selected_index).element);</span> <span class='diff-add'> </span> <span class='diff-add'> // Cancel browser keyboard scroll.</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var SlideScrollManager = function(notebook, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Public constructor.</span> <span class='diff-add'> */</span> <span class='diff-add'> TargetScrollManager.apply(this, [notebook, options]);</span> <span class='diff-add'> };</span> <span class='diff-add'> SlideScrollManager.prototype = Object.create(TargetScrollManager.prototype);</span> <span class='diff-add'> SlideScrollManager.prototype.is_target = function (index) {</span> <span class='diff-add'> var cell = this.notebook.get_cell(index);</span> <span class='diff-add'> return cell.metadata && cell.metadata.slideshow && </span> <span class='diff-add'> cell.metadata.slideshow.slide_type && </span> <span class='diff-add'> (cell.metadata.slideshow.slide_type === "slide" ||</span> <span class='diff-add'> cell.metadata.slideshow.slide_type === "subslide");</span> <span class='diff-add'> };</span> <span class='diff-add'> var HeadingScrollManager = function(notebook, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Public constructor.</span> <span class='diff-add'> */</span> <span class='diff-add'> ScrollManager.apply(this, [notebook, options]);</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> this._level = options.heading_level || 1;</span> <span class='diff-add'> };</span> <span class='diff-add'> HeadingScrollManager.prototype = Object.create(ScrollManager.prototype);</span> <span class='diff-add'> HeadingScrollManager.prototype.scroll = function (delta) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Scroll the document.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters</span> <span class='diff-add'> * ----------</span> <span class='diff-add'> * delta: integer</span> <span class='diff-add'> * direction to scroll the document. Positive is downwards.</span> <span class='diff-add'> * Units are headers.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Get all of the header elements that match the heading level or are of</span> <span class='diff-add'> * greater magnitude (a smaller header number).</span> <span class='diff-add'> */</span> <span class='diff-add'> var headers = $();</span> <span class='diff-add'> var i;</span> <span class='diff-add'> for (i = 1; i <= this._level; i++) {</span> <span class='diff-add'> headers = headers.add('#notebook-container h' + i);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Find the header the user is on or below.</span> <span class='diff-add'> var first_cell_top = this.notebook.get_cell(0).element.offset().top;</span> <span class='diff-add'> var current_scroll = this.element.scrollTop();</span> <span class='diff-add'> var header_scroll = 0;</span> <span class='diff-add'> i = -1;</span> <span class='diff-add'> while (current_scroll >= header_scroll && i < headers.length) {</span> <span class='diff-add'> if (++i < headers.length) {</span> <span class='diff-add'> header_scroll = $(headers[i]).offset().top - first_cell_top;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> i--;</span> <span class='diff-add'> // Check if the user is below the header.</span> <span class='diff-add'> if (i < 0 || current_scroll > $(headers[i]).offset().top - first_cell_top + 30) {</span> <span class='diff-add'> // Below the header, count the header as a target.</span> <span class='diff-add'> if (delta < 0) {</span> <span class='diff-add'> delta += 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> i += delta;</span> <span class='diff-add'> // Scroll!</span> <span class='diff-add'> if (0 <= i && i < headers.length) {</span> <span class='diff-add'> this.scroll_to(headers[i]);</span> <span class='diff-add'> return false;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // Default to the base's scroll behavior when target header doesn't</span> <span class='diff-add'> // exist.</span> <span class='diff-add'> return ScrollManager.prototype.scroll.apply(this, [delta]);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // Return naemspace for require.js loads</span> <span class='diff-add'> return {</span> <span class='diff-add'> 'ScrollManager': ScrollManager,</span> <span class='diff-add'> 'SlideScrollManager': SlideScrollManager,</span> <span class='diff-add'> 'HeadingScrollManager': HeadingScrollManager,</span> <span class='diff-add'> 'TargetScrollManager': TargetScrollManager</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/security.js b/ipynb/Array-feature-overlap-05_files/security.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..11ba8da</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/security.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'components/google-caja/html-css-sanitizer-minified',</span> <span class='diff-add'>], function(IPython, $) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> </span> <span class='diff-add'> var noop = function (x) { return x; };</span> <span class='diff-add'> </span> <span class='diff-add'> var caja;</span> <span class='diff-add'> if (window && window.html) {</span> <span class='diff-add'> caja = window.html;</span> <span class='diff-add'> caja.html4 = window.html4;</span> <span class='diff-add'> caja.sanitizeStylesheet = window.sanitizeStylesheet;</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> var sanitizeAttribs = function (tagName, attribs, opt_naiveUriRewriter, opt_nmTokenPolicy, opt_logger) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * add trusting data-attributes to the default sanitizeAttribs from caja</span> <span class='diff-add'> * this function is mostly copied from the caja source</span> <span class='diff-add'> */</span> <span class='diff-add'> var ATTRIBS = caja.html4.ATTRIBS;</span> <span class='diff-add'> for (var i = 0; i < attribs.length; i += 2) {</span> <span class='diff-add'> var attribName = attribs[i];</span> <span class='diff-add'> if (attribName.substr(0,5) == 'data-') {</span> <span class='diff-add'> var attribKey = '*::' + attribName;</span> <span class='diff-add'> if (!ATTRIBS.hasOwnProperty(attribKey)) {</span> <span class='diff-add'> ATTRIBS[attribKey] = 0;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return caja.sanitizeAttribs(tagName, attribs, opt_naiveUriRewriter, opt_nmTokenPolicy, opt_logger);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var sanitize_css = function (css, tagPolicy) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * sanitize CSS</span> <span class='diff-add'> * like sanitize_html, but for CSS</span> <span class='diff-add'> * called by sanitize_stylesheets</span> <span class='diff-add'> */</span> <span class='diff-add'> return caja.sanitizeStylesheet(</span> <span class='diff-add'> window.location.pathname,</span> <span class='diff-add'> css,</span> <span class='diff-add'> {</span> <span class='diff-add'> containerClass: null,</span> <span class='diff-add'> idSuffix: '',</span> <span class='diff-add'> tagPolicy: tagPolicy,</span> <span class='diff-add'> virtualizeAttrName: noop</span> <span class='diff-add'> },</span> <span class='diff-add'> noop</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var sanitize_stylesheets = function (html, tagPolicy) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * sanitize just the css in style tags in a block of html</span> <span class='diff-add'> * called by sanitize_html, if allow_css is true</span> <span class='diff-add'> */</span> <span class='diff-add'> var h = $("<div/>").append(html);</span> <span class='diff-add'> var style_tags = h.find("style");</span> <span class='diff-add'> if (!style_tags.length) {</span> <span class='diff-add'> // no style tags to sanitize</span> <span class='diff-add'> return html;</span> <span class='diff-add'> }</span> <span class='diff-add'> style_tags.each(function(i, style) {</span> <span class='diff-add'> style.innerHTML = sanitize_css(style.innerHTML, tagPolicy);</span> <span class='diff-add'> });</span> <span class='diff-add'> return h.html();</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var sanitize_html = function (html, allow_css) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * sanitize HTML</span> <span class='diff-add'> * if allow_css is true (default: false), CSS is sanitized as well.</span> <span class='diff-add'> * otherwise, CSS elements and attributes are simply removed.</span> <span class='diff-add'> */</span> <span class='diff-add'> var html4 = caja.html4;</span> <span class='diff-add'> if (allow_css) {</span> <span class='diff-add'> // allow sanitization of style tags,</span> <span class='diff-add'> // not just scrubbing</span> <span class='diff-add'> html4.ELEMENTS.style &= ~html4.eflags.UNSAFE;</span> <span class='diff-add'> html4.ATTRIBS.style = html4.atype.STYLE;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // scrub all CSS</span> <span class='diff-add'> html4.ELEMENTS.style |= html4.eflags.UNSAFE;</span> <span class='diff-add'> html4.ATTRIBS.style = html4.atype.SCRIPT;</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> var record_messages = function (msg, opts) {</span> <span class='diff-add'> console.log("HTML Sanitizer", msg, opts);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var policy = function (tagName, attribs) {</span> <span class='diff-add'> if (!(html4.ELEMENTS[tagName] & html4.eflags.UNSAFE)) {</span> <span class='diff-add'> return {</span> <span class='diff-add'> 'attribs': sanitizeAttribs(tagName, attribs,</span> <span class='diff-add'> noop, noop, record_messages)</span> <span class='diff-add'> };</span> <span class='diff-add'> } else {</span> <span class='diff-add'> record_messages(tagName + " removed", {</span> <span class='diff-add'> change: "removed",</span> <span class='diff-add'> tagName: tagName</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var sanitized = caja.sanitizeWithPolicy(html, policy);</span> <span class='diff-add'> </span> <span class='diff-add'> if (allow_css) {</span> <span class='diff-add'> // sanitize style tags as stylesheets</span> <span class='diff-add'> sanitized = sanitize_stylesheets(result.sanitized, policy);</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> return sanitized;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var security = {</span> <span class='diff-add'> caja: caja,</span> <span class='diff-add'> sanitize_html: sanitize_html</span> <span class='diff-add'> };</span> <span class='diff-add'> IPython.security = security;</span> <span class='diff-add'> return security;</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/serialize.js b/ipynb/Array-feature-overlap-05_files/serialize.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..4da4c9a</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/serialize.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'underscore',</span> <span class='diff-add'> ], function (_) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> </span> <span class='diff-add'> var _deserialize_array_buffer = function (buf) {</span> <span class='diff-add'> var data = new DataView(buf);</span> <span class='diff-add'> // read the header: 1 + nbufs 32b integers</span> <span class='diff-add'> var nbufs = data.getUint32(0);</span> <span class='diff-add'> var offsets = [];</span> <span class='diff-add'> var i;</span> <span class='diff-add'> for (i = 1; i <= nbufs; i++) {</span> <span class='diff-add'> offsets.push(data.getUint32(i * 4));</span> <span class='diff-add'> }</span> <span class='diff-add'> var json_bytes = new Uint8Array(buf.slice(offsets[0], offsets[1]));</span> <span class='diff-add'> var msg = JSON.parse(</span> <span class='diff-add'> (new TextDecoder('utf8')).decode(json_bytes)</span> <span class='diff-add'> );</span> <span class='diff-add'> // the remaining chunks are stored as DataViews in msg.buffers</span> <span class='diff-add'> msg.buffers = [];</span> <span class='diff-add'> var start, stop;</span> <span class='diff-add'> for (i = 1; i < nbufs; i++) {</span> <span class='diff-add'> start = offsets[i];</span> <span class='diff-add'> stop = offsets[i+1] || buf.byteLength;</span> <span class='diff-add'> msg.buffers.push(new DataView(buf.slice(start, stop)));</span> <span class='diff-add'> }</span> <span class='diff-add'> return msg;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var _deserialize_binary = function(data, callback) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * deserialize the binary message format</span> <span class='diff-add'> * callback will be called with a message whose buffers attribute</span> <span class='diff-add'> * will be an array of DataViews.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (data instanceof Blob) {</span> <span class='diff-add'> // data is Blob, have to deserialize from ArrayBuffer in reader callback</span> <span class='diff-add'> var reader = new FileReader();</span> <span class='diff-add'> reader.onload = function () {</span> <span class='diff-add'> var msg = _deserialize_array_buffer(this.result);</span> <span class='diff-add'> callback(msg);</span> <span class='diff-add'> };</span> <span class='diff-add'> reader.readAsArrayBuffer(data);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // data is ArrayBuffer, can deserialize directly</span> <span class='diff-add'> var msg = _deserialize_array_buffer(data);</span> <span class='diff-add'> callback(msg);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var deserialize = function (data, callback) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * deserialize a message and pass the unpacked message object to callback</span> <span class='diff-add'> */</span> <span class='diff-add'> if (typeof data === "string") {</span> <span class='diff-add'> // text JSON message</span> <span class='diff-add'> callback(JSON.parse(data));</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // binary message</span> <span class='diff-add'> _deserialize_binary(data, callback);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var _serialize_binary = function (msg) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * implement the binary serialization protocol</span> <span class='diff-add'> * serializes JSON message to ArrayBuffer</span> <span class='diff-add'> */</span> <span class='diff-add'> msg = _.clone(msg);</span> <span class='diff-add'> var offsets = [];</span> <span class='diff-add'> var buffers = [];</span> <span class='diff-add'> msg.buffers.map(function (buf) {</span> <span class='diff-add'> buffers.push(buf);</span> <span class='diff-add'> });</span> <span class='diff-add'> delete msg.buffers;</span> <span class='diff-add'> var json_utf8 = (new TextEncoder('utf8')).encode(JSON.stringify(msg));</span> <span class='diff-add'> buffers.unshift(json_utf8);</span> <span class='diff-add'> var nbufs = buffers.length;</span> <span class='diff-add'> offsets.push(4 * (nbufs + 1));</span> <span class='diff-add'> var i;</span> <span class='diff-add'> for (i = 0; i + 1 < buffers.length; i++) {</span> <span class='diff-add'> offsets.push(offsets[offsets.length-1] + buffers[i].byteLength);</span> <span class='diff-add'> }</span> <span class='diff-add'> var msg_buf = new Uint8Array(</span> <span class='diff-add'> offsets[offsets.length-1] + buffers[buffers.length-1].byteLength</span> <span class='diff-add'> );</span> <span class='diff-add'> // use DataView.setUint32 for network byte-order</span> <span class='diff-add'> var view = new DataView(msg_buf.buffer);</span> <span class='diff-add'> // write nbufs to first 4 bytes</span> <span class='diff-add'> view.setUint32(0, nbufs);</span> <span class='diff-add'> // write offsets to next 4 * nbufs bytes</span> <span class='diff-add'> for (i = 0; i < offsets.length; i++) {</span> <span class='diff-add'> view.setUint32(4 * (i+1), offsets[i]);</span> <span class='diff-add'> }</span> <span class='diff-add'> // write all the buffers at their respective offsets</span> <span class='diff-add'> for (i = 0; i < buffers.length; i++) {</span> <span class='diff-add'> msg_buf.set(new Uint8Array(buffers[i].buffer), offsets[i]);</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> // return raw ArrayBuffer</span> <span class='diff-add'> return msg_buf.buffer;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var serialize = function (msg) {</span> <span class='diff-add'> if (msg.buffers && msg.buffers.length) {</span> <span class='diff-add'> return _serialize_binary(msg);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return JSON.stringify(msg);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var exports = {</span> <span class='diff-add'> deserialize : deserialize,</span> <span class='diff-add'> serialize: serialize</span> <span class='diff-add'> };</span> <span class='diff-add'> return exports;</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/session.js b/ipynb/Array-feature-overlap-05_files/session.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..5790b6d</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/session.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> 'services/kernels/kernel',</span> <span class='diff-add'>], function(IPython, $, utils, kernel) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Session object for accessing the session REST api. The session</span> <span class='diff-add'> * should be used to start kernels and then shut them down -- for</span> <span class='diff-add'> * all other operations, the kernel object should be used.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Options should include:</span> <span class='diff-add'> * - notebook_path: the path (not including name) to the notebook</span> <span class='diff-add'> * - kernel_name: the type of kernel (e.g. python3)</span> <span class='diff-add'> * - base_url: the root url of the notebook server</span> <span class='diff-add'> * - ws_url: the url to access websockets</span> <span class='diff-add'> * - notebook: Notebook object</span> <span class='diff-add'> *</span> <span class='diff-add'> * @class Session</span> <span class='diff-add'> * @param {Object} options</span> <span class='diff-add'> */</span> <span class='diff-add'> var Session = function (options) {</span> <span class='diff-add'> this.id = null;</span> <span class='diff-add'> this.notebook_model = {</span> <span class='diff-add'> path: options.notebook_path</span> <span class='diff-add'> };</span> <span class='diff-add'> this.kernel_model = {</span> <span class='diff-add'> id: null,</span> <span class='diff-add'> name: options.kernel_name</span> <span class='diff-add'> };</span> <span class='diff-add'> this.base_url = options.base_url;</span> <span class='diff-add'> this.ws_url = options.ws_url;</span> <span class='diff-add'> this.session_service_url = utils.url_join_encode(this.base_url, 'api/sessions');</span> <span class='diff-add'> this.session_url = null;</span> <span class='diff-add'> this.notebook = options.notebook;</span> <span class='diff-add'> this.kernel = null;</span> <span class='diff-add'> this.events = options.notebook.events;</span> <span class='diff-add'> this.bind_events();</span> <span class='diff-add'> };</span> <span class='diff-add'> Session.prototype.bind_events = function () {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var record_status = function (evt, info) {</span> <span class='diff-add'> console.log('Session: ' + evt.type + ' (' + info.session.id + ')');</span> <span class='diff-add'> };</span> <span class='diff-add'> this.events.on('kernel_created.Session', record_status);</span> <span class='diff-add'> this.events.on('kernel_dead.Session', record_status);</span> <span class='diff-add'> this.events.on('kernel_killed.Session', record_status);</span> <span class='diff-add'> // if the kernel dies, then also remove the session</span> <span class='diff-add'> this.events.on('kernel_dead.Kernel', function () {</span> <span class='diff-add'> that.delete();</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> // Public REST api functions</span> <span class='diff-add'> /**</span> <span class='diff-add'> * GET /api/sessions</span> <span class='diff-add'> *</span> <span class='diff-add'> * Get a list of the current sessions.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function list</span> <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span> <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span> <span class='diff-add'> */</span> <span class='diff-add'> Session.prototype.list = function (success, error) {</span> <span class='diff-add'> $.ajax(this.session_service_url, {</span> <span class='diff-add'> processData: false,</span> <span class='diff-add'> cache: false,</span> <span class='diff-add'> type: "GET",</span> <span class='diff-add'> dataType: "json",</span> <span class='diff-add'> success: success,</span> <span class='diff-add'> error: this._on_error(error)</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * POST /api/sessions</span> <span class='diff-add'> *</span> <span class='diff-add'> * Start a new session. This function can only executed once.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function start</span> <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span> <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span> <span class='diff-add'> */</span> <span class='diff-add'> Session.prototype.start = function (success, error) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var on_success = function (data, status, xhr) {</span> <span class='diff-add'> if (that.kernel) {</span> <span class='diff-add'> that.kernel.name = that.kernel_model.name;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> var kernel_service_url = utils.url_path_join(that.base_url, "api/kernels");</span> <span class='diff-add'> that.kernel = new kernel.Kernel(kernel_service_url, that.ws_url, that.notebook, that.kernel_model.name);</span> <span class='diff-add'> }</span> <span class='diff-add'> that.events.trigger('kernel_created.Session', {session: that, kernel: that.kernel});</span> <span class='diff-add'> that.kernel._kernel_created(data.kernel);</span> <span class='diff-add'> if (success) {</span> <span class='diff-add'> success(data, status, xhr);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var on_error = function (xhr, status, err) {</span> <span class='diff-add'> that.events.trigger('kernel_dead.Session', {session: that, xhr: xhr, status: status, error: err});</span> <span class='diff-add'> if (error) {</span> <span class='diff-add'> error(xhr, status, err);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> $.ajax(this.session_service_url, {</span> <span class='diff-add'> processData: false,</span> <span class='diff-add'> cache: false,</span> <span class='diff-add'> type: "POST",</span> <span class='diff-add'> data: JSON.stringify(this._get_model()),</span> <span class='diff-add'> dataType: "json",</span> <span class='diff-add'> success: this._on_success(on_success),</span> <span class='diff-add'> error: this._on_error(on_error)</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * GET /api/sessions/[:session_id]</span> <span class='diff-add'> *</span> <span class='diff-add'> * Get information about a session.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function get_info</span> <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span> <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span> <span class='diff-add'> */</span> <span class='diff-add'> Session.prototype.get_info = function (success, error) {</span> <span class='diff-add'> $.ajax(this.session_url, {</span> <span class='diff-add'> processData: false,</span> <span class='diff-add'> cache: false,</span> <span class='diff-add'> type: "GET",</span> <span class='diff-add'> dataType: "json",</span> <span class='diff-add'> success: this._on_success(success),</span> <span class='diff-add'> error: this._on_error(error)</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * PATCH /api/sessions/[:session_id]</span> <span class='diff-add'> *</span> <span class='diff-add'> * Rename or move a notebook. If the given name or path are</span> <span class='diff-add'> * undefined, then they will not be changed.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function rename_notebook</span> <span class='diff-add'> * @param {string} [path] - new notebook path</span> <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span> <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span> <span class='diff-add'> */</span> <span class='diff-add'> Session.prototype.rename_notebook = function (path, success, error) {</span> <span class='diff-add'> if (path !== undefined) {</span> <span class='diff-add'> this.notebook_model.path = path;</span> <span class='diff-add'> }</span> <span class='diff-add'> $.ajax(this.session_url, {</span> <span class='diff-add'> processData: false,</span> <span class='diff-add'> cache: false,</span> <span class='diff-add'> type: "PATCH",</span> <span class='diff-add'> data: JSON.stringify(this._get_model()),</span> <span class='diff-add'> dataType: "json",</span> <span class='diff-add'> success: this._on_success(success),</span> <span class='diff-add'> error: this._on_error(error)</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * DELETE /api/sessions/[:session_id]</span> <span class='diff-add'> *</span> <span class='diff-add'> * Kill the kernel and shutdown the session.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function delete</span> <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span> <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span> <span class='diff-add'> */</span> <span class='diff-add'> Session.prototype.delete = function (success, error) {</span> <span class='diff-add'> if (this.kernel) {</span> <span class='diff-add'> this.events.trigger('kernel_killed.Session', {session: this, kernel: this.kernel});</span> <span class='diff-add'> this.kernel._kernel_dead();</span> <span class='diff-add'> }</span> <span class='diff-add'> $.ajax(this.session_url, {</span> <span class='diff-add'> processData: false,</span> <span class='diff-add'> cache: false,</span> <span class='diff-add'> type: "DELETE",</span> <span class='diff-add'> dataType: "json",</span> <span class='diff-add'> success: this._on_success(success),</span> <span class='diff-add'> error: this._on_error(error)</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Restart the session by deleting it and the starting it</span> <span class='diff-add'> * fresh. If options are given, they can include any of the</span> <span class='diff-add'> * following:</span> <span class='diff-add'> *</span> <span class='diff-add'> * - notebook_path - the path to the notebook</span> <span class='diff-add'> * - kernel_name - the name (type) of the kernel</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function restart</span> <span class='diff-add'> * @param {Object} [options] - options for the new kernel</span> <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span> <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span> <span class='diff-add'> */</span> <span class='diff-add'> Session.prototype.restart = function (options, success, error) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var start = function () {</span> <span class='diff-add'> if (options && options.notebook_path) {</span> <span class='diff-add'> that.notebook_model.path = options.notebook_path;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (options && options.kernel_name) {</span> <span class='diff-add'> that.kernel_model.name = options.kernel_name;</span> <span class='diff-add'> }</span> <span class='diff-add'> that.kernel_model.id = null;</span> <span class='diff-add'> that.start(success, error);</span> <span class='diff-add'> };</span> <span class='diff-add'> this.delete(start, start);</span> <span class='diff-add'> };</span> <span class='diff-add'> // Helper functions</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get the data model for the session, which includes the notebook path</span> <span class='diff-add'> * and kernel (name and id).</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function _get_model</span> <span class='diff-add'> * @returns {Object} - the data model</span> <span class='diff-add'> */</span> <span class='diff-add'> Session.prototype._get_model = function () {</span> <span class='diff-add'> return {</span> <span class='diff-add'> notebook: this.notebook_model,</span> <span class='diff-add'> kernel: this.kernel_model</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the data model from the given JSON object, which should</span> <span class='diff-add'> * have attributes of `id`, `notebook`, and/or `kernel`. If</span> <span class='diff-add'> * provided, the notebook data must include name and path, and the</span> <span class='diff-add'> * kernel data must include name and id.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function _update_model</span> <span class='diff-add'> * @param {Object} data - updated data model</span> <span class='diff-add'> */</span> <span class='diff-add'> Session.prototype._update_model = function (data) {</span> <span class='diff-add'> if (data && data.id) {</span> <span class='diff-add'> this.id = data.id;</span> <span class='diff-add'> this.session_url = utils.url_join_encode(this.session_service_url, this.id);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (data && data.notebook) {</span> <span class='diff-add'> this.notebook_model.path = data.notebook.path;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (data && data.kernel) {</span> <span class='diff-add'> this.kernel_model.name = data.kernel.name;</span> <span class='diff-add'> this.kernel_model.id = data.kernel.id;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle a successful AJAX request by updating the session data</span> <span class='diff-add'> * model with the response, and then optionally calling a provided</span> <span class='diff-add'> * callback.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function _on_success</span> <span class='diff-add'> * @param {function} success - callback</span> <span class='diff-add'> */</span> <span class='diff-add'> Session.prototype._on_success = function (success) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> return function (data, status, xhr) {</span> <span class='diff-add'> that._update_model(data);</span> <span class='diff-add'> if (success) {</span> <span class='diff-add'> success(data, status, xhr);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle a failed AJAX request by logging the error message, and</span> <span class='diff-add'> * then optionally calling a provided callback.</span> <span class='diff-add'> *</span> <span class='diff-add'> * @function _on_error</span> <span class='diff-add'> * @param {function} error - callback</span> <span class='diff-add'> */</span> <span class='diff-add'> Session.prototype._on_error = function (error) {</span> <span class='diff-add'> return function (xhr, status, err) {</span> <span class='diff-add'> utils.log_ajax_error(xhr, status, err);</span> <span class='diff-add'> if (error) {</span> <span class='diff-add'> error(xhr, status, err);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Error type indicating that the session is already starting.</span> <span class='diff-add'> */</span> <span class='diff-add'> var SessionAlreadyStarting = function (message) {</span> <span class='diff-add'> this.name = "SessionAlreadyStarting";</span> <span class='diff-add'> this.message = (message || "");</span> <span class='diff-add'> };</span> <span class='diff-add'> SessionAlreadyStarting.prototype = Error.prototype;</span> <span class='diff-add'> </span> <span class='diff-add'> // For backwards compatability.</span> <span class='diff-add'> IPython.Session = Session;</span> <span class='diff-add'> return {</span> <span class='diff-add'> Session: Session,</span> <span class='diff-add'> SessionAlreadyStarting: SessionAlreadyStarting</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/slideshow.js b/ipynb/Array-feature-overlap-05_files/slideshow.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..6b2b35e</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/slideshow.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'notebook/js/celltoolbar',</span> <span class='diff-add'>], function($, celltoolbar) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var CellToolbar = celltoolbar.CellToolbar;</span> <span class='diff-add'> var slideshow_preset = [];</span> <span class='diff-add'> var select_type = CellToolbar.utils.select_ui_generator([</span> <span class='diff-add'> ["-" ,"-" ],</span> <span class='diff-add'> ["Slide" ,"slide" ],</span> <span class='diff-add'> ["Sub-Slide" ,"subslide" ],</span> <span class='diff-add'> ["Fragment" ,"fragment" ],</span> <span class='diff-add'> ["Skip" ,"skip" ],</span> <span class='diff-add'> ["Notes" ,"notes" ],</span> <span class='diff-add'> ],</span> <span class='diff-add'> // setter</span> <span class='diff-add'> function(cell, value){</span> <span class='diff-add'> // we check that the slideshow namespace exist and create it if needed</span> <span class='diff-add'> if (cell.metadata.slideshow === undefined){cell.metadata.slideshow = {};}</span> <span class='diff-add'> // set the value</span> <span class='diff-add'> cell.metadata.slideshow.slide_type = value;</span> <span class='diff-add'> },</span> <span class='diff-add'> //geter</span> <span class='diff-add'> function(cell){ var ns = cell.metadata.slideshow;</span> <span class='diff-add'> // if the slideshow namespace does not exist return `undefined`</span> <span class='diff-add'> // (will be interpreted as `false` by checkbox) otherwise</span> <span class='diff-add'> // return the value</span> <span class='diff-add'> return (ns === undefined)? undefined: ns.slide_type;</span> <span class='diff-add'> },</span> <span class='diff-add'> "Slide Type");</span> <span class='diff-add'> var register = function (notebook) {</span> <span class='diff-add'> CellToolbar.register_callback('slideshow.select',select_type);</span> <span class='diff-add'> slideshow_preset.push('slideshow.select');</span> <span class='diff-add'> CellToolbar.register_preset('Slideshow',slideshow_preset, notebook);</span> <span class='diff-add'> console.log('Slideshow extension for metadata editing loaded.');</span> <span class='diff-add'> };</span> <span class='diff-add'> return {'register': register};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/stex.js b/ipynb/Array-feature-overlap-05_files/stex.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..835ed46</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/stex.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span> <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span> <span class='diff-add'>/*</span> <span class='diff-add'> * Author: Constantin Jucovschi ([email protected])</span> <span class='diff-add'> * Licence: MIT</span> <span class='diff-add'> */</span> <span class='diff-add'>(function(mod) {</span> <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span> <span class='diff-add'> mod(require("../../lib/codemirror"));</span> <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span> <span class='diff-add'> define(["../../lib/codemirror"], mod);</span> <span class='diff-add'> else // Plain browser env</span> <span class='diff-add'> mod(CodeMirror);</span> <span class='diff-add'>})(function(CodeMirror) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> CodeMirror.defineMode("stex", function() {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> function pushCommand(state, command) {</span> <span class='diff-add'> state.cmdState.push(command);</span> <span class='diff-add'> }</span> <span class='diff-add'> function peekCommand(state) {</span> <span class='diff-add'> if (state.cmdState.length > 0) {</span> <span class='diff-add'> return state.cmdState[state.cmdState.length - 1];</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function popCommand(state) {</span> <span class='diff-add'> var plug = state.cmdState.pop();</span> <span class='diff-add'> if (plug) {</span> <span class='diff-add'> plug.closeBracket();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // returns the non-default plugin closest to the end of the list</span> <span class='diff-add'> function getMostPowerful(state) {</span> <span class='diff-add'> var context = state.cmdState;</span> <span class='diff-add'> for (var i = context.length - 1; i >= 0; i--) {</span> <span class='diff-add'> var plug = context[i];</span> <span class='diff-add'> if (plug.name == "DEFAULT") {</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> return plug;</span> <span class='diff-add'> }</span> <span class='diff-add'> return { styleIdentifier: function() { return null; } };</span> <span class='diff-add'> }</span> <span class='diff-add'> function addPluginPattern(pluginName, cmdStyle, styles) {</span> <span class='diff-add'> return function () {</span> <span class='diff-add'> this.name = pluginName;</span> <span class='diff-add'> this.bracketNo = 0;</span> <span class='diff-add'> this.style = cmdStyle;</span> <span class='diff-add'> this.styles = styles;</span> <span class='diff-add'> this.argument = null; // \begin and \end have arguments that follow. These are stored in the plugin</span> <span class='diff-add'> this.styleIdentifier = function() {</span> <span class='diff-add'> return this.styles[this.bracketNo - 1] || null;</span> <span class='diff-add'> };</span> <span class='diff-add'> this.openBracket = function() {</span> <span class='diff-add'> this.bracketNo++;</span> <span class='diff-add'> return "bracket";</span> <span class='diff-add'> };</span> <span class='diff-add'> this.closeBracket = function() {};</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> var plugins = {};</span> <span class='diff-add'> plugins["importmodule"] = addPluginPattern("importmodule", "tag", ["string", "builtin"]);</span> <span class='diff-add'> plugins["documentclass"] = addPluginPattern("documentclass", "tag", ["", "atom"]);</span> <span class='diff-add'> plugins["usepackage"] = addPluginPattern("usepackage", "tag", ["atom"]);</span> <span class='diff-add'> plugins["begin"] = addPluginPattern("begin", "tag", ["atom"]);</span> <span class='diff-add'> plugins["end"] = addPluginPattern("end", "tag", ["atom"]);</span> <span class='diff-add'> plugins["DEFAULT"] = function () {</span> <span class='diff-add'> this.name = "DEFAULT";</span> <span class='diff-add'> this.style = "tag";</span> <span class='diff-add'> this.styleIdentifier = this.openBracket = this.closeBracket = function() {};</span> <span class='diff-add'> };</span> <span class='diff-add'> function setState(state, f) {</span> <span class='diff-add'> state.f = f;</span> <span class='diff-add'> }</span> <span class='diff-add'> // called when in a normal (no environment) context</span> <span class='diff-add'> function normal(source, state) {</span> <span class='diff-add'> var plug;</span> <span class='diff-add'> // Do we look like '\command' ? If so, attempt to apply the plugin 'command'</span> <span class='diff-add'> if (source.match(/^\\[a-zA-Z@]+/)) {</span> <span class='diff-add'> var cmdName = source.current().slice(1);</span> <span class='diff-add'> plug = plugins[cmdName] || plugins["DEFAULT"];</span> <span class='diff-add'> plug = new plug();</span> <span class='diff-add'> pushCommand(state, plug);</span> <span class='diff-add'> setState(state, beginParams);</span> <span class='diff-add'> return plug.style;</span> <span class='diff-add'> }</span> <span class='diff-add'> // escape characters</span> <span class='diff-add'> if (source.match(/^\\[$&%#{}_]/)) {</span> <span class='diff-add'> return "tag";</span> <span class='diff-add'> }</span> <span class='diff-add'> // white space control characters</span> <span class='diff-add'> if (source.match(/^\\[,;!\/\\]/)) {</span> <span class='diff-add'> return "tag";</span> <span class='diff-add'> }</span> <span class='diff-add'> // find if we're starting various math modes</span> <span class='diff-add'> if (source.match("\\[")) {</span> <span class='diff-add'> setState(state, function(source, state){ return inMathMode(source, state, "\\]"); });</span> <span class='diff-add'> return "keyword";</span> <span class='diff-add'> }</span> <span class='diff-add'> if (source.match("$$")) {</span> <span class='diff-add'> setState(state, function(source, state){ return inMathMode(source, state, "$$"); });</span> <span class='diff-add'> return "keyword";</span> <span class='diff-add'> }</span> <span class='diff-add'> if (source.match("$")) {</span> <span class='diff-add'> setState(state, function(source, state){ return inMathMode(source, state, "$"); });</span> <span class='diff-add'> return "keyword";</span> <span class='diff-add'> }</span> <span class='diff-add'> var ch = source.next();</span> <span class='diff-add'> if (ch == "%") {</span> <span class='diff-add'> source.skipToEnd();</span> <span class='diff-add'> return "comment";</span> <span class='diff-add'> } else if (ch == '}' || ch == ']') {</span> <span class='diff-add'> plug = peekCommand(state);</span> <span class='diff-add'> if (plug) {</span> <span class='diff-add'> plug.closeBracket(ch);</span> <span class='diff-add'> setState(state, beginParams);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return "error";</span> <span class='diff-add'> }</span> <span class='diff-add'> return "bracket";</span> <span class='diff-add'> } else if (ch == '{' || ch == '[') {</span> <span class='diff-add'> plug = plugins["DEFAULT"];</span> <span class='diff-add'> plug = new plug();</span> <span class='diff-add'> pushCommand(state, plug);</span> <span class='diff-add'> return "bracket";</span> <span class='diff-add'> } else if (/\d/.test(ch)) {</span> <span class='diff-add'> source.eatWhile(/[\w.%]/);</span> <span class='diff-add'> return "atom";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> source.eatWhile(/[\w\-_]/);</span> <span class='diff-add'> plug = getMostPowerful(state);</span> <span class='diff-add'> if (plug.name == 'begin') {</span> <span class='diff-add'> plug.argument = source.current();</span> <span class='diff-add'> }</span> <span class='diff-add'> return plug.styleIdentifier();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function inMathMode(source, state, endModeSeq) {</span> <span class='diff-add'> if (source.eatSpace()) {</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (source.match(endModeSeq)) {</span> <span class='diff-add'> setState(state, normal);</span> <span class='diff-add'> return "keyword";</span> <span class='diff-add'> }</span> <span class='diff-add'> if (source.match(/^\\[a-zA-Z@]+/)) {</span> <span class='diff-add'> return "tag";</span> <span class='diff-add'> }</span> <span class='diff-add'> if (source.match(/^[a-zA-Z]+/)) {</span> <span class='diff-add'> return "variable-2";</span> <span class='diff-add'> }</span> <span class='diff-add'> // escape characters</span> <span class='diff-add'> if (source.match(/^\\[$&%#{}_]/)) {</span> <span class='diff-add'> return "tag";</span> <span class='diff-add'> }</span> <span class='diff-add'> // white space control characters</span> <span class='diff-add'> if (source.match(/^\\[,;!\/]/)) {</span> <span class='diff-add'> return "tag";</span> <span class='diff-add'> }</span> <span class='diff-add'> // special math-mode characters</span> <span class='diff-add'> if (source.match(/^[\^_&]/)) {</span> <span class='diff-add'> return "tag";</span> <span class='diff-add'> }</span> <span class='diff-add'> // non-special characters</span> <span class='diff-add'> if (source.match(/^[+\-<>|=,\/@!*:;'"`~#?]/)) {</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (source.match(/^(\d+\.\d*|\d*\.\d+|\d+)/)) {</span> <span class='diff-add'> return "number";</span> <span class='diff-add'> }</span> <span class='diff-add'> var ch = source.next();</span> <span class='diff-add'> if (ch == "{" || ch == "}" || ch == "[" || ch == "]" || ch == "(" || ch == ")") {</span> <span class='diff-add'> return "bracket";</span> <span class='diff-add'> }</span> <span class='diff-add'> if (ch == "%") {</span> <span class='diff-add'> source.skipToEnd();</span> <span class='diff-add'> return "comment";</span> <span class='diff-add'> }</span> <span class='diff-add'> return "error";</span> <span class='diff-add'> }</span> <span class='diff-add'> function beginParams(source, state) {</span> <span class='diff-add'> var ch = source.peek(), lastPlug;</span> <span class='diff-add'> if (ch == '{' || ch == '[') {</span> <span class='diff-add'> lastPlug = peekCommand(state);</span> <span class='diff-add'> lastPlug.openBracket(ch);</span> <span class='diff-add'> source.eat(ch);</span> <span class='diff-add'> setState(state, normal);</span> <span class='diff-add'> return "bracket";</span> <span class='diff-add'> }</span> <span class='diff-add'> if (/[ \t\r]/.test(ch)) {</span> <span class='diff-add'> source.eat(ch);</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> setState(state, normal);</span> <span class='diff-add'> popCommand(state);</span> <span class='diff-add'> return normal(source, state);</span> <span class='diff-add'> }</span> <span class='diff-add'> return {</span> <span class='diff-add'> startState: function() {</span> <span class='diff-add'> return {</span> <span class='diff-add'> cmdState: [],</span> <span class='diff-add'> f: normal</span> <span class='diff-add'> };</span> <span class='diff-add'> },</span> <span class='diff-add'> copyState: function(s) {</span> <span class='diff-add'> return {</span> <span class='diff-add'> cmdState: s.cmdState.slice(),</span> <span class='diff-add'> f: s.f</span> <span class='diff-add'> };</span> <span class='diff-add'> },</span> <span class='diff-add'> token: function(stream, state) {</span> <span class='diff-add'> return state.f(stream, state);</span> <span class='diff-add'> },</span> <span class='diff-add'> blankLine: function(state) {</span> <span class='diff-add'> state.f = normal;</span> <span class='diff-add'> state.cmdState.length = 0;</span> <span class='diff-add'> },</span> <span class='diff-add'> lineComment: "%"</span> <span class='diff-add'> };</span> <span class='diff-add'> });</span> <span class='diff-add'> CodeMirror.defineMIME("text/x-stex", "stex");</span> <span class='diff-add'> CodeMirror.defineMIME("text/x-latex", "stex");</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/style.min.css b/ipynb/Array-feature-overlap-05_files/style.min.css</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..d22d07d</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/style.min.css</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>/*!</span> <span class='diff-add'>*</span> <span class='diff-add'>* Twitter Bootstrap</span> <span class='diff-add'>*</span> <span class='diff-add'>*//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:1.42857143;color:#000;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:3px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:18px;margin-bottom:9px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:9px;margin-bottom:9px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:33px}h2,.h2{font-size:27px}h3,.h3{font-size:23px}h4,.h4{font-size:17px}h5,.h5{font-size:13px}h6,.h6{font-size:12px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:14px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:19.5px}}small,.small{font-size:92%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:9px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:18px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:541px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:9px 18px;margin:0 0 18px;font-size:inherit;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:18px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:2px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:1px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;box-shadow:none}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:2px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:0;padding-right:0}@media (min-width:768px){.container{width:768px}}@media (min-width:992px){.container{width:940px}}@media (min-width:1200px){.container{width:1140px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:0;padding-right:0}.row{margin-left:0;margin-right:0}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:0;padding-right:0}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:18px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:18px;font-size:19.5px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:13px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:32px;padding:6px 12px;font-size:13px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:32px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:45px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:18px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:1px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:45px;padding:10px 16px;font-size:17px;line-height:1.33;border-radius:3px}select.input-lg,select.form-group-lg .form-control{height:45px;line-height:45px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:32px;height:32px;line-height:32px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:45px;height:45px;line-height:45px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:23px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#404040}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:25px}.form-horizontal .form-group{margin-left:0;margin-right:0}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:0}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:13px;line-height:1.42857143;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:17px;line-height:1.33;border-radius:3px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:1px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:1px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:13px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:2px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:541px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:2px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:2px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:17px;line-height:1.33;border-radius:3px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:1px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:13px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:2px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:1px}.input-group-addon.input-lg{padding:10px 16px;font-size:17px;border-radius:3px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:2px 2px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:2px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:2px 2px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:2px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:2px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:2px 2px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:30px;margin-bottom:18px;border:1px solid transparent}@media (min-width:541px){.navbar{border-radius:2px}}@media (min-width:541px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:0;padding-left:0;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:541px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;visibility:visible !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:540px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}@media (min-width:541px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:541px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:541px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:6px 0;font-size:17px;line-height:18px;height:30px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:541px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:0}}.navbar-toggle{position:relative;float:right;margin-right:0;padding:9px 10px;margin-top:-2px;margin-bottom:-2px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:2px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:541px){.navbar-toggle{display:none}}.navbar-nav{margin:3px 0}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:18px}@media (max-width:540px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:18px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:541px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:6px;padding-bottom:6px}}.navbar-form{margin-left:0;margin-right:0;padding:10px 0;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:-1px;margin-bottom:-1px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:540px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:541px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-top-right-radius:2px;border-top-left-radius:2px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:-1px;margin-bottom:-1px}.navbar-btn.btn-sm{margin-top:0;margin-bottom:0}.navbar-btn.btn-xs{margin-top:4px;margin-bottom:4px}.navbar-text{margin-top:6px;margin-bottom:6px}@media (min-width:541px){.navbar-text{float:left;margin-left:0;margin-right:0}}@media (min-width:541px){.navbar-left{float:left !important;float:left}.navbar-right{float:right !important;float:right;margin-right:0}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:540px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:540px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:18px;list-style:none;background-color:#f5f5f5;border-radius:2px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#5e5e5e}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:2px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:17px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:1px;border-top-left-radius:1px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:1px;border-top-right-radius:1px}.pager{padding-left:0;margin:18px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:20px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:3px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:58.5px}}.thumbnail{display:block;padding:4px;margin-bottom:18px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#000}.alert{padding:15px;margin-bottom:18px;border:1px solid transparent;border-radius:2px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f5f5f5;border-radius:2px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:18px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:2px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:1px;border-top-left-radius:1px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:15px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:1px;border-top-left-radius:1px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:1px;border-top-left-radius:1px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:1px;border-top-right-radius:1px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:1px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:1px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:1px;border-bottom-right-radius:1px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:1px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:2px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:3px}.well-sm{padding:9px;border-radius:1px}.close{float:right;font-size:19.5px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:3px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;visibility:visible;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:normal;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:2px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1.42857143;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:3px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:13px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:2px 2px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{transition:transform .6s ease-in-out;backface-visibility:hidden;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after,.item_buttons:before,.item_buttons:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after,.item_buttons:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}/*!</span> <span class='diff-add'>*</span> <span class='diff-add'>* Font Awesome</span> <span class='diff-add'>*</span> <span class='diff-add'>*//*!</span> <span class='diff-add'> * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome</span> <span class='diff-add'> * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)</span> <span class='diff-add'> */@font-face{font-family:'FontAwesome';src:url('../components/font-awesome/fonts/fontawesome-webfont.eot?v=4.3.0');src:url('../components/font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('../components/font-awesome/fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('../components/font-awesome/fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('../components/font-awesome/fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('../components/font-awesome/fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}/*!</span> <span class='diff-add'>*</span> <span class='diff-add'>* IPython base</span> <span class='diff-add'>*</span> <span class='diff-add'>*/.modal.fade .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}code{color:#000}pre{font-size:inherit;line-height:inherit}label{font-weight:normal}.border-box-sizing{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.corner-all{border-radius:2px}.no-padding{padding:0}.hbox{display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.hbox>*{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;flex:none}.vbox{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}.vbox>*{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;flex:none}.hbox.reverse,.vbox.reverse,.reverse{-webkit-box-direction:reverse;-moz-box-direction:reverse;box-direction:reverse;flex-direction:row-reverse}.hbox.box-flex0,.vbox.box-flex0,.box-flex0{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;flex:none;width:auto}.hbox.box-flex1,.vbox.box-flex1,.box-flex1{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}.hbox.box-flex,.vbox.box-flex,.box-flex{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}.hbox.box-flex2,.vbox.box-flex2,.box-flex2{-webkit-box-flex:2;-moz-box-flex:2;box-flex:2;flex:2}.box-group1{-webkit-box-flex-group:1;-moz-box-flex-group:1;box-flex-group:1}.box-group2{-webkit-box-flex-group:2;-moz-box-flex-group:2;box-flex-group:2}.hbox.start,.vbox.start,.start{-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;justify-content:flex-start}.hbox.end,.vbox.end,.end{-webkit-box-pack:end;-moz-box-pack:end;box-pack:end;justify-content:flex-end}.hbox.center,.vbox.center,.center{-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;justify-content:center}.hbox.baseline,.vbox.baseline,.baseline{-webkit-box-pack:baseline;-moz-box-pack:baseline;box-pack:baseline;justify-content:baseline}.hbox.stretch,.vbox.stretch,.stretch{-webkit-box-pack:stretch;-moz-box-pack:stretch;box-pack:stretch;justify-content:stretch}.hbox.align-start,.vbox.align-start,.align-start{-webkit-box-align:start;-moz-box-align:start;box-align:start;align-items:flex-start}.hbox.align-end,.vbox.align-end,.align-end{-webkit-box-align:end;-moz-box-align:end;box-align:end;align-items:flex-end}.hbox.align-center,.vbox.align-center,.align-center{-webkit-box-align:center;-moz-box-align:center;box-align:center;align-items:center}.hbox.align-baseline,.vbox.align-baseline,.align-baseline{-webkit-box-align:baseline;-moz-box-align:baseline;box-align:baseline;align-items:baseline}.hbox.align-stretch,.vbox.align-stretch,.align-stretch{-webkit-box-align:stretch;-moz-box-align:stretch;box-align:stretch;align-items:stretch}div.error{margin:2em;text-align:center}div.error>h1{font-size:500%;line-height:normal}div.error>p{font-size:200%;line-height:normal}div.traceback-wrapper{text-align:left;max-width:800px;margin:auto}body{background-color:#fff;position:absolute;left:0;right:0;top:0;bottom:0;overflow:visible}#header{display:none;background-color:#fff;position:relative;z-index:100}#header #header-container{padding-bottom:5px;padding-top:5px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}#header .header-bar{width:100%;height:1px;background:#e7e7e7;margin-bottom:-1px}@media print{#header{display:none !important}}#header-spacer{width:100%;visibility:hidden}@media print{#header-spacer{display:none}}#ipython_notebook{padding-left:0;padding-top:1px;padding-bottom:1px}@media (max-width:991px){#ipython_notebook{margin-left:10px}}#noscript{width:auto;padding-top:16px;padding-bottom:16px;text-align:center;font-size:22px;color:red;font-weight:bold}#ipython_notebook img{height:28px}#site{width:100%;display:none;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;overflow:auto}@media print{#site{height:auto !important}}.ui-button .ui-button-text{padding:.2em .8em;font-size:77%}input.ui-button{padding:.3em .9em}span#login_widget{float:right}span#login_widget>.button,#logout{color:#333;background-color:#fff;border-color:#ccc}span#login_widget>.button:hover,#logout:hover,span#login_widget>.button:focus,#logout:focus,span#login_widget>.button.focus,#logout.focus,span#login_widget>.button:active,#logout:active,span#login_widget>.button.active,#logout.active,.open>.dropdown-togglespan#login_widget>.button,.open>.dropdown-toggle#logout{color:#333;background-color:#e6e6e6;border-color:#adadad}span#login_widget>.button:active,#logout:active,span#login_widget>.button.active,#logout.active,.open>.dropdown-togglespan#login_widget>.button,.open>.dropdown-toggle#logout{background-image:none}span#login_widget>.button.disabled,#logout.disabled,span#login_widget>.button[disabled],#logout[disabled],fieldset[disabled] span#login_widget>.button,fieldset[disabled] #logout,span#login_widget>.button.disabled:hover,#logout.disabled:hover,span#login_widget>.button[disabled]:hover,#logout[disabled]:hover,fieldset[disabled] span#login_widget>.button:hover,fieldset[disabled] #logout:hover,span#login_widget>.button.disabled:focus,#logout.disabled:focus,span#login_widget>.button[disabled]:focus,#logout[disabled]:focus,fieldset[disabled] span#login_widget>.button:focus,fieldset[disabled] #logout:focus,span#login_widget>.button.disabled.focus,#logout.disabled.focus,span#login_widget>.button[disabled].focus,#logout[disabled].focus,fieldset[disabled] span#login_widget>.button.focus,fieldset[disabled] #logout.focus,span#login_widget>.button.disabled:active,#logout.disabled:active,span#login_widget>.button[disabled]:active,#logout[disabled]:active,fieldset[disabled] span#login_widget>.button:active,fieldset[disabled] #logout:active,span#login_widget>.button.disabled.active,#logout.disabled.active,span#login_widget>.button[disabled].active,#logout[disabled].active,fieldset[disabled] span#login_widget>.button.active,fieldset[disabled] #logout.active{background-color:#fff;border-color:#ccc}span#login_widget>.button .badge,#logout .badge{color:#fff;background-color:#333}.nav-header{text-transform:none}#header>span{margin-top:10px}.modal_stretch .modal-dialog{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;min-height:80%}.modal_stretch .modal-dialog .modal-body{max-height:none;flex:1}@media (min-width:768px){.modal .modal-dialog{width:700px}}@media (min-width:768px){select.form-control{margin-left:12px;margin-right:12px}}/*!</span> <span class='diff-add'>*</span> <span class='diff-add'>* IPython auth</span> <span class='diff-add'>*</span> <span class='diff-add'>*/.center-nav{display:inline-block;margin-bottom:-4px}/*!</span> <span class='diff-add'>*</span> <span class='diff-add'>* IPython tree view</span> <span class='diff-add'>*</span> <span class='diff-add'>*/.alternate_upload{background-color:none;display:inline}.alternate_upload.form{padding:0;margin:0}.alternate_upload input.fileinput{display:inline;opacity:0;z-index:2;width:12ex;margin-right:-12ex}.alternate_upload .input-overlay{display:inline-block;font-weight:bold;line-height:1em}ul#tabs{margin-bottom:4px}ul#tabs a{padding-top:6px;padding-bottom:4px}ul.breadcrumb a:focus,ul.breadcrumb a:hover{text-decoration:none}ul.breadcrumb i.icon-home{font-size:16px;margin-right:4px}ul.breadcrumb span{color:#5e5e5e}.list_toolbar{padding:4px 0 4px 0;vertical-align:middle}.list_toolbar .tree-buttons{padding-top:1px}.dynamic-buttons{display:inline-block}.list_toolbar [class*="span"]{min-height:24px}.list_header{font-weight:bold;background-color:#eee}.list_placeholder{font-weight:bold;padding-top:4px;padding-bottom:4px;padding-left:7px;padding-right:7px}.list_container{margin-top:4px;margin-bottom:20px;border:1px solid #ddd;border-radius:2px}.list_container>div{border-bottom:1px solid #ddd}.list_container>div:hover .list-item{background-color:red}.list_container>div:last-child{border:none}.list_item:hover .list_item{background-color:#ddd}.list_item a{text-decoration:none}.list_item:hover{background-color:#fafafa}.action_col{text-align:right}.list_header>div,.list_item>div{padding-top:4px;padding-bottom:4px;padding-left:7px;padding-right:7px;line-height:22px}.list_header>div input,.list_item>div input{margin-right:7px;margin-left:14px;vertical-align:baseline;line-height:22px;position:relative;top:-1px}.list_header>div .item_link,.list_item>div .item_link{margin-left:-1px;vertical-align:baseline;line-height:22px}.new-file input[type=checkbox]{visibility:hidden}.item_name{line-height:22px;height:24px}.item_icon{font-size:14px;color:#5e5e5e;margin-right:7px;margin-left:7px;line-height:22px;vertical-align:baseline}.item_buttons{padding-top:4px;line-height:1em;margin-left:-5px}.item_buttons .btn-group,.item_buttons .input-group{float:left}.item_buttons>.btn,.item_buttons>.btn-group,.item_buttons>.input-group{margin-left:5px}.item_buttons .btn{min-width:13ex}.item_buttons .running-indicator{color:#5cb85c}.toolbar_info{height:24px;line-height:24px}input.nbname_input,input.engine_num_input{padding-top:3px;padding-bottom:3px;height:22px;line-height:14px;margin:0}input.engine_num_input{width:60px}.highlight_text{color:blue}#project_name{display:inline-block;padding-left:7px;margin-left:-2px}#project_name>.breadcrumb{padding:0;margin-bottom:0;background-color:transparent;font-weight:bold}#tree-selector{display:inline-block;padding-right:0}#tree-selector input[type=checkbox]{margin-left:7px;vertical-align:baseline}.tab-content .row{margin-left:0;margin-right:0}.folder_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f114"}.folder_icon:before.pull-left{margin-right:.3em}.folder_icon:before.pull-right{margin-left:.3em}.notebook_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f02d";position:relative;top:-1px}.notebook_icon:before.pull-left{margin-right:.3em}.notebook_icon:before.pull-right{margin-left:.3em}.running_notebook_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f02d";position:relative;top:-1px;color:#5cb85c}.running_notebook_icon:before.pull-left{margin-right:.3em}.running_notebook_icon:before.pull-right{margin-left:.3em}.file_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f016";position:relative;top:-2px}.file_icon:before.pull-left{margin-right:.3em}.file_icon:before.pull-right{margin-left:.3em}#notebook_toolbar .pull-right{padding-top:0;margin-right:-1px}ul#new-menu{left:auto;right:0}.kernel-menu-icon{padding-right:12px;width:24px;content:"\f096"}.kernel-menu-icon:before{content:"\f096"}.kernel-menu-icon-current:before{content:"\f00c"}#tab_content{padding-top:20px}#running .panel-group .panel{margin-top:3px;margin-bottom:1em}#running .panel-group .panel .panel-heading{background-color:#eee;padding-top:4px;padding-bottom:4px;padding-left:7px;padding-right:7px;line-height:22px}#running .panel-group .panel .panel-heading a:focus,#running .panel-group .panel .panel-heading a:hover{text-decoration:none}#running .panel-group .panel .panel-body{padding:0}#running .panel-group .panel .panel-body .list_container{margin-top:0;margin-bottom:0;border:0;border-radius:0}#running .panel-group .panel .panel-body .list_container .list_item{border-bottom:1px solid #ddd}#running .panel-group .panel .panel-body .list_container .list_item:last-child{border-bottom:0}.delete-button{display:none}.duplicate-button{display:none}.rename-button{display:none}.shutdown-button{display:none}/*!</span> <span class='diff-add'>*</span> <span class='diff-add'>* IPython text editor webapp</span> <span class='diff-add'>*</span> <span class='diff-add'>*/.selected-keymap i.fa{padding:0 5px}.selected-keymap i.fa:before{content:"\f00c"}#mode-menu{overflow:auto;max-height:20em}.edit_app #header{-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,0.2);box-shadow:0 0 12px 1px rgba(87,87,87,0.2)}.edit_app #menubar .navbar{margin-bottom:-1px}.dirty-indicator{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);width:20px}.dirty-indicator.pull-left{margin-right:.3em}.dirty-indicator.pull-right{margin-left:.3em}.dirty-indicator-dirty{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);width:20px}.dirty-indicator-dirty.pull-left{margin-right:.3em}.dirty-indicator-dirty.pull-right{margin-left:.3em}.dirty-indicator-clean{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);width:20px}.dirty-indicator-clean.pull-left{margin-right:.3em}.dirty-indicator-clean.pull-right{margin-left:.3em}.dirty-indicator-clean:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f00c"}.dirty-indicator-clean:before.pull-left{margin-right:.3em}.dirty-indicator-clean:before.pull-right{margin-left:.3em}#filename{font-size:16pt;display:table;padding:0 5px}#current-mode{padding-left:5px;padding-right:5px}#texteditor-backdrop{padding-top:20px;padding-bottom:20px}@media not print{#texteditor-backdrop{background-color:#eee}}@media print{#texteditor-backdrop #texteditor-container .CodeMirror-gutter,#texteditor-backdrop #texteditor-container .CodeMirror-gutters{background-color:#fff}}@media not print{#texteditor-backdrop #texteditor-container .CodeMirror-gutter,#texteditor-backdrop #texteditor-container .CodeMirror-gutters{background-color:#fff}}@media not print{#texteditor-backdrop #texteditor-container{padding:0;background-color:#fff;-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,0.2);box-shadow:0 0 12px 1px rgba(87,87,87,0.2)}}/*!</span> <span class='diff-add'>*</span> <span class='diff-add'>* IPython notebook</span> <span class='diff-add'>*</span> <span class='diff-add'>*/.ansibold{font-weight:bold}.ansiblack{color:black}.ansired{color:darkred}.ansigreen{color:darkgreen}.ansiyellow{color:#c4a000}.ansiblue{color:darkblue}.ansipurple{color:darkviolet}.ansicyan{color:steelblue}.ansigray{color:gray}.ansibgblack{background-color:black}.ansibgred{background-color:red}.ansibggreen{background-color:green}.ansibgyellow{background-color:yellow}.ansibgblue{background-color:blue}.ansibgpurple{background-color:magenta}.ansibgcyan{background-color:cyan}.ansibggray{background-color:gray}div.cell{border:1px solid transparent;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;border-radius:2px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border-width:thin;border-style:solid;width:100%;padding:5px;margin:0;outline:none}div.cell.selected{border-color:#ababab}@media print{div.cell.selected{border-color:transparent}}.edit_mode div.cell.selected{border-color:green}@media print{.edit_mode div.cell.selected{border-color:transparent}}.prompt{min-width:14ex;padding:.4em;margin:0;font-family:monospace;text-align:right;line-height:1.21429em}@media (max-width:540px){.prompt{text-align:left}}div.inner_cell{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}@-moz-document url-prefix(){div.inner_cell{overflow-x:hidden}}div.input_area{border:1px solid #cfcfcf;border-radius:2px;background:#f7f7f7;line-height:1.21429em}div.prompt:empty{padding-top:0;padding-bottom:0}div.unrecognized_cell{padding:5px 5px 5px 0;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}div.unrecognized_cell .inner_cell{border-radius:2px;padding:5px;font-weight:bold;color:red;border:1px solid #cfcfcf;background:#eaeaea}div.unrecognized_cell .inner_cell a{color:inherit;text-decoration:none}div.unrecognized_cell .inner_cell a:hover{color:inherit;text-decoration:none}@media (max-width:540px){div.unrecognized_cell>div.prompt{display:none}}@media print{div.code_cell{page-break-inside:avoid}}div.input{page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}@media (max-width:540px){div.input{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}}div.input_prompt{color:navy;border-top:1px solid transparent}div.input_area>div.highlight{margin:.4em;border:none;padding:0;background-color:transparent}div.input_area>div.highlight>pre{margin:0;border:none;padding:0;background-color:transparent}.CodeMirror{line-height:1.21429em;font-size:14px;height:auto;background:none}.CodeMirror-scroll{overflow-y:hidden;overflow-x:auto}.CodeMirror-lines{padding:.4em}.CodeMirror-linenumber{padding:0 8px 0 4px}.CodeMirror-gutters{border-bottom-left-radius:2px;border-top-left-radius:2px}.CodeMirror pre{padding:0;border:0;border-radius:0}.highlight-base{color:#000}.highlight-variable{color:#000}.highlight-variable-2{color:#1a1a1a}.highlight-variable-3{color:#333}.highlight-string{color:#ba2121}.highlight-comment{color:#408080;font-style:italic}.highlight-number{color:#080}.highlight-atom{color:#88f}.highlight-keyword{color:#008000;font-weight:bold}.highlight-builtin{color:#008000}.highlight-error{color:#f00}.highlight-operator{color:#a2f;font-weight:bold}.highlight-meta{color:#a2f}.highlight-def{color:#00f}.highlight-string-2{color:#f50}.highlight-qualifier{color:#555}.highlight-bracket{color:#997}.highlight-tag{color:#170}.highlight-attribute{color:#00c}.highlight-header{color:blue}.highlight-quote{color:#090}.highlight-link{color:#00c}.cm-s-ipython span.cm-keyword{color:#008000;font-weight:bold}.cm-s-ipython span.cm-atom{color:#88f}.cm-s-ipython span.cm-number{color:#080}.cm-s-ipython span.cm-def{color:#00f}.cm-s-ipython span.cm-variable{color:#000}.cm-s-ipython span.cm-operator{color:#a2f;font-weight:bold}.cm-s-ipython span.cm-variable-2{color:#1a1a1a}.cm-s-ipython span.cm-variable-3{color:#333}.cm-s-ipython span.cm-comment{color:#408080;font-style:italic}.cm-s-ipython span.cm-string{color:#ba2121}.cm-s-ipython span.cm-string-2{color:#f50}.cm-s-ipython span.cm-meta{color:#a2f}.cm-s-ipython span.cm-qualifier{color:#555}.cm-s-ipython span.cm-builtin{color:#008000}.cm-s-ipython span.cm-bracket{color:#997}.cm-s-ipython span.cm-tag{color:#170}.cm-s-ipython span.cm-attribute{color:#00c}.cm-s-ipython span.cm-header{color:blue}.cm-s-ipython span.cm-quote{color:#090}.cm-s-ipython span.cm-link{color:#00c}.cm-s-ipython span.cm-error{color:#f00}.cm-s-ipython span.cm-tab{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);background-position:right;background-repeat:no-repeat}div.output_wrapper{position:relative;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}div.output_scroll{height:24em;width:100%;overflow:auto;border-radius:2px;-webkit-box-shadow:inset 0 2px 8px rgba(0,0,0,0.8);box-shadow:inset 0 2px 8px rgba(0,0,0,0.8);display:block}div.output_collapsed{margin:0;padding:0;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}div.out_prompt_overlay{height:100%;padding:0 .4em;position:absolute;border-radius:2px}div.out_prompt_overlay:hover{-webkit-box-shadow:inset 0 0 1px #000;box-shadow:inset 0 0 1px #000;background:rgba(240,240,240,0.5)}div.output_prompt{color:darkred}div.output_area{padding:0;page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}div.output_area .MathJax_Display{text-align:left !important}div.output_area .rendered_html table{margin-left:0;margin-right:0}div.output_area .rendered_html img{margin-left:0;margin-right:0}.output{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}@media (max-width:540px){div.output_area{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}}div.output_area pre{margin:0;padding:0;border:0;vertical-align:baseline;color:black;background-color:transparent;border-radius:0}div.output_subarea{padding:.4em;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}div.output_text{text-align:left;color:#000;line-height:1.21429em}div.output_stderr{background:#fdd}div.output_latex{text-align:left}div.output_javascript:empty{padding:0}.js-error{color:darkred}div.raw_input_container{font-family:monospace;padding-top:5px}input.raw_input{font-family:inherit;font-size:inherit;color:inherit;width:auto;vertical-align:baseline;padding:0 .25em;margin:0 .25em}input.raw_input:focus{box-shadow:none}p.p-space{margin-bottom:10px}div.output_unrecognized{padding:5px;font-weight:bold;color:red}div.output_unrecognized a{color:inherit;text-decoration:none}div.output_unrecognized a:hover{color:inherit;text-decoration:none}.rendered_html{color:#000}.rendered_html em{font-style:italic}.rendered_html strong{font-weight:bold}.rendered_html u{text-decoration:underline}.rendered_html :link{text-decoration:underline}.rendered_html :visited{text-decoration:underline}.rendered_html h1{font-size:185.7%;margin:1.08em 0 0 0;font-weight:bold;line-height:1}.rendered_html h2{font-size:157.1%;margin:1.27em 0 0 0;font-weight:bold;line-height:1}.rendered_html h3{font-size:128.6%;margin:1.55em 0 0 0;font-weight:bold;line-height:1}.rendered_html h4{font-size:100%;margin:2em 0 0 0;font-weight:bold;line-height:1}.rendered_html h5{font-size:100%;margin:2em 0 0 0;font-weight:bold;line-height:1;font-style:italic}.rendered_html h6{font-size:100%;margin:2em 0 0 0;font-weight:bold;line-height:1;font-style:italic}.rendered_html h1:first-child{margin-top:.538em}.rendered_html h2:first-child{margin-top:.636em}.rendered_html h3:first-child{margin-top:.777em}.rendered_html h4:first-child{margin-top:1em}.rendered_html h5:first-child{margin-top:1em}.rendered_html h6:first-child{margin-top:1em}.rendered_html ul{list-style:disc;margin:0 2em;padding-left:0}.rendered_html ul ul{list-style:square;margin:0 2em}.rendered_html ul ul ul{list-style:circle;margin:0 2em}.rendered_html ol{list-style:decimal;margin:0 2em;padding-left:0}.rendered_html ol ol{list-style:upper-alpha;margin:0 2em}.rendered_html ol ol ol{list-style:lower-alpha;margin:0 2em}.rendered_html ol ol ol ol{list-style:lower-roman;margin:0 2em}.rendered_html ol ol ol ol ol{list-style:decimal;margin:0 2em}.rendered_html *+ul{margin-top:1em}.rendered_html *+ol{margin-top:1em}.rendered_html hr{color:black;background-color:black}.rendered_html pre{margin:1em 2em}.rendered_html pre,.rendered_html code{border:0;background-color:#fff;color:#000;font-size:100%;padding:0}.rendered_html blockquote{margin:1em 2em}.rendered_html table{margin-left:auto;margin-right:auto;border:1px solid black;border-collapse:collapse}.rendered_html tr,.rendered_html th,.rendered_html td{border:1px solid black;border-collapse:collapse;margin:1em 2em}.rendered_html td,.rendered_html th{text-align:left;vertical-align:middle;padding:4px}.rendered_html th{font-weight:bold}.rendered_html *+table{margin-top:1em}.rendered_html p{text-align:left}.rendered_html *+p{margin-top:1em}.rendered_html img{display:block;margin-left:auto;margin-right:auto}.rendered_html *+img{margin-top:1em}div.text_cell{display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}@media (max-width:540px){div.text_cell>div.prompt{display:none}}div.text_cell_render{outline:none;resize:none;width:inherit;border-style:none;padding:.5em .5em .5em .4em;color:#000;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}a.anchor-link:link{text-decoration:none;padding:0 20px;visibility:hidden}h1:hover .anchor-link,h2:hover .anchor-link,h3:hover .anchor-link,h4:hover .anchor-link,h5:hover .anchor-link,h6:hover .anchor-link{visibility:visible}.text_cell.rendered .input_area{display:none}.text_cell.unrendered .text_cell_render{display:none}.cm-header-1,.cm-header-2,.cm-header-3,.cm-header-4,.cm-header-5,.cm-header-6{font-weight:bold;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.cm-header-1{font-size:185.7%}.cm-header-2{font-size:157.1%}.cm-header-3{font-size:128.6%}.cm-header-4{font-size:110%}.cm-header-5{font-size:100%;font-style:italic}.cm-header-6{font-size:100%;font-style:italic}.widget-interact>div,.widget-interact>input{padding:2.5px}.widget-area{page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.widget-area .widget-subarea{padding:.44em .4em .4em 1px;margin-left:6px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;-webkit-box-flex:2;-moz-box-flex:2;box-flex:2;flex:2;-webkit-box-align:start;-moz-box-align:start;box-align:start;align-items:flex-start}.widget-area.connection-problems .prompt:after{content:"\f127";font-family:'FontAwesome';color:#d9534f;font-size:14px;top:3px;padding:3px}.slide-track{border:1px solid #ccc;background:#fff;border-radius:2px}.widget-hslider{padding-left:8px;padding-right:2px;overflow:visible;width:350px;height:5px;max-height:5px;margin-top:13px;margin-bottom:10px;border:1px solid #ccc;background:#fff;border-radius:2px;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.widget-hslider .ui-slider{border:0;background:none;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}.widget-hslider .ui-slider .ui-slider-handle{width:12px;height:28px;margin-top:-8px;border-radius:2px}.widget-hslider .ui-slider .ui-slider-range{height:12px;margin-top:-4px;background:#eee}.widget-vslider{padding-bottom:5px;overflow:visible;width:5px;max-width:5px;height:250px;margin-left:12px;border:1px solid #ccc;background:#fff;border-radius:2px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}.widget-vslider .ui-slider{border:0;background:none;margin-left:-4px;margin-top:5px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}.widget-vslider .ui-slider .ui-slider-handle{width:28px;height:12px;margin-left:-9px;border-radius:2px}.widget-vslider .ui-slider .ui-slider-range{width:12px;margin-left:-1px;background:#eee}.widget-text{width:350px;margin:0}.widget-listbox{width:350px;margin-bottom:0}.widget-numeric-text{width:150px;margin:0}.widget-progress{margin-top:6px;min-width:350px}.widget-progress .progress-bar{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.widget-combo-btn{min-width:125px}.widget_item .dropdown-menu li a{color:inherit}.widget-hbox{display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.widget-hbox input[type="checkbox"]{margin-top:9px;margin-bottom:10px}.widget-hbox .widget-label{min-width:10ex;padding-right:8px;padding-top:5px;text-align:right;vertical-align:text-top}.widget-hbox .widget-readout{padding-left:8px;padding-top:5px;text-align:left;vertical-align:text-top}.widget-vbox{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}.widget-vbox .widget-label{padding-bottom:5px;text-align:center;vertical-align:text-bottom}.widget-vbox .widget-readout{padding-top:5px;text-align:center;vertical-align:text-top}.widget-box{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-box-align:start;-moz-box-align:start;box-align:start;align-items:flex-start}.widget-radio-box{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding-top:4px}.widget-radio-box label{margin-top:0}.widget-radio{margin-left:20px}/*!</span> <span class='diff-add'>*</span> <span class='diff-add'>* IPython notebook webapp</span> <span class='diff-add'>*</span> <span class='diff-add'>*/@media (max-width:767px){.notebook_app{padding-left:0;padding-right:0}}#ipython-main-app{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;height:100%}div#notebook_panel{margin:0;padding:0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;height:100%}#notebook{font-size:14px;line-height:20px;overflow-y:hidden;overflow-x:auto;width:100%;padding-top:20px;margin:0;outline:none;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;min-height:100%}@media not print{#notebook-container{padding:15px;background-color:#fff;min-height:0;-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,0.2);box-shadow:0 0 12px 1px rgba(87,87,87,0.2)}}div.ui-widget-content{border:1px solid #ababab;outline:none}pre.dialog{background-color:#f7f7f7;border:1px solid #ddd;border-radius:2px;padding:.4em;padding-left:2em}p.dialog{padding:.2em}pre,code,kbd,samp{white-space:pre-wrap}#fonttest{font-family:monospace}p{margin-bottom:0}.end_space{min-height:100px;transition:height .2s ease}.notebook_app #header{-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,0.2);box-shadow:0 0 12px 1px rgba(87,87,87,0.2)}@media not print{.notebook_app{background-color:#eee}}.celltoolbar{border:thin solid #cfcfcf;border-bottom:none;background:#eee;border-radius:2px 2px 0 0;width:100%;height:29px;padding-right:4px;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch;-webkit-box-pack:end;-moz-box-pack:end;box-pack:end;justify-content:flex-end}@media print{.celltoolbar{display:none}}.ctb_hideshow{display:none;vertical-align:bottom}.ctb_global_show .ctb_show.ctb_hideshow{display:block}.ctb_global_show .ctb_show+.input_area,.ctb_global_show .ctb_show+div.text_cell_input,.ctb_global_show .ctb_show~div.text_cell_render{border-top-right-radius:0;border-top-left-radius:0}.ctb_global_show .ctb_show~div.text_cell_render{border:1px solid #cfcfcf}.celltoolbar{font-size:87%;padding-top:3px}.celltoolbar select{display:block;width:100%;height:32px;padding:6px 12px;font-size:13px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:1px;width:inherit;font-size:inherit;height:22px;padding:0;display:inline-block}.celltoolbar select:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.celltoolbar select::-moz-placeholder{color:#999;opacity:1}.celltoolbar select:-ms-input-placeholder{color:#999}.celltoolbar select::-webkit-input-placeholder{color:#999}.celltoolbar select[disabled],.celltoolbar select[readonly],fieldset[disabled] .celltoolbar select{cursor:not-allowed;background-color:#eee;opacity:1}textarea.celltoolbar select{height:auto}select.celltoolbar select{height:30px;line-height:30px}textarea.celltoolbar select,select[multiple].celltoolbar select{height:auto}.celltoolbar label{margin-left:5px;margin-right:5px}.completions{position:absolute;z-index:10;overflow:hidden;border:1px solid #ababab;border-radius:2px;-webkit-box-shadow:0 6px 10px -1px #adadad;box-shadow:0 6px 10px -1px #adadad}.completions select{background:white;outline:none;border:none;padding:0;margin:0;overflow:auto;font-family:monospace;font-size:110%;color:#000;width:auto}.completions select option.context{color:#286090}#kernel_logo_widget{float:right !important;float:right}#kernel_logo_widget .current_kernel_logo{display:none;margin-top:-1px;margin-bottom:-1px;width:32px;height:32px}#menubar{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;margin-top:1px}#menubar .navbar{border-top:1px;border-radius:0 0 2px 2px;margin-bottom:0}#menubar .navbar-toggle{float:left;padding-top:7px;padding-bottom:7px;border:none}#menubar .navbar-collapse{clear:left}.nav-wrapper{border-bottom:1px solid #e7e7e7}i.menu-icon{padding-top:4px}ul#help_menu li a{overflow:hidden;padding-right:2.2em}ul#help_menu li a i{margin-right:-1.2em}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropdown-submenu>a:after{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);display:block;content:"\f0da";float:right;color:#333;margin-top:2px;margin-right:-10px}.dropdown-submenu>a:after.pull-left{margin-right:.3em}.dropdown-submenu>a:after.pull-right{margin-left:.3em}.dropdown-submenu:hover>a:after{color:#262626}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px}#notification_area{float:right !important;float:right;z-index:10}.indicator_area{float:right !important;float:right;color:#777;margin-left:5px;margin-right:5px;width:11px;z-index:10;text-align:center;width:auto}#kernel_indicator{float:right !important;float:right;color:#777;margin-left:5px;margin-right:5px;width:11px;z-index:10;text-align:center;width:auto;border-left:1px solid}#kernel_indicator .kernel_indicator_name{padding-left:5px;padding-right:5px}#modal_indicator{float:right !important;float:right;color:#777;margin-left:5px;margin-right:5px;width:11px;z-index:10;text-align:center;width:auto}#readonly-indicator{float:right !important;float:right;color:#777;margin-left:5px;margin-right:5px;width:11px;z-index:10;text-align:center;width:auto;margin-top:2px;margin-bottom:0;margin-left:0;margin-right:0;display:none}.modal_indicator:before{width:1.28571429em;text-align:center}.edit_mode .modal_indicator:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f040"}.edit_mode .modal_indicator:before.pull-left{margin-right:.3em}.edit_mode .modal_indicator:before.pull-right{margin-left:.3em}.command_mode .modal_indicator:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:' '}.command_mode .modal_indicator:before.pull-left{margin-right:.3em}.command_mode .modal_indicator:before.pull-right{margin-left:.3em}.kernel_idle_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f10c"}.kernel_idle_icon:before.pull-left{margin-right:.3em}.kernel_idle_icon:before.pull-right{margin-left:.3em}.kernel_busy_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f111"}.kernel_busy_icon:before.pull-left{margin-right:.3em}.kernel_busy_icon:before.pull-right{margin-left:.3em}.kernel_dead_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f1e2"}.kernel_dead_icon:before.pull-left{margin-right:.3em}.kernel_dead_icon:before.pull-right{margin-left:.3em}.kernel_disconnected_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f127"}.kernel_disconnected_icon:before.pull-left{margin-right:.3em}.kernel_disconnected_icon:before.pull-right{margin-left:.3em}.notification_widget{color:#777;z-index:10;background:rgba(240,240,240,0.5);color:#333;background-color:#fff;border-color:#ccc}.notification_widget:hover,.notification_widget:focus,.notification_widget.focus,.notification_widget:active,.notification_widget.active,.open>.dropdown-toggle.notification_widget{color:#333;background-color:#e6e6e6;border-color:#adadad}.notification_widget:active,.notification_widget.active,.open>.dropdown-toggle.notification_widget{background-image:none}.notification_widget.disabled,.notification_widget[disabled],fieldset[disabled] .notification_widget,.notification_widget.disabled:hover,.notification_widget[disabled]:hover,fieldset[disabled] .notification_widget:hover,.notification_widget.disabled:focus,.notification_widget[disabled]:focus,fieldset[disabled] .notification_widget:focus,.notification_widget.disabled.focus,.notification_widget[disabled].focus,fieldset[disabled] .notification_widget.focus,.notification_widget.disabled:active,.notification_widget[disabled]:active,fieldset[disabled] .notification_widget:active,.notification_widget.disabled.active,.notification_widget[disabled].active,fieldset[disabled] .notification_widget.active{background-color:#fff;border-color:#ccc}.notification_widget .badge{color:#fff;background-color:#333}.notification_widget.warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.notification_widget.warning:hover,.notification_widget.warning:focus,.notification_widget.warning.focus,.notification_widget.warning:active,.notification_widget.warning.active,.open>.dropdown-toggle.notification_widget.warning{color:#fff;background-color:#ec971f;border-color:#d58512}.notification_widget.warning:active,.notification_widget.warning.active,.open>.dropdown-toggle.notification_widget.warning{background-image:none}.notification_widget.warning.disabled,.notification_widget.warning[disabled],fieldset[disabled] .notification_widget.warning,.notification_widget.warning.disabled:hover,.notification_widget.warning[disabled]:hover,fieldset[disabled] .notification_widget.warning:hover,.notification_widget.warning.disabled:focus,.notification_widget.warning[disabled]:focus,fieldset[disabled] .notification_widget.warning:focus,.notification_widget.warning.disabled.focus,.notification_widget.warning[disabled].focus,fieldset[disabled] .notification_widget.warning.focus,.notification_widget.warning.disabled:active,.notification_widget.warning[disabled]:active,fieldset[disabled] .notification_widget.warning:active,.notification_widget.warning.disabled.active,.notification_widget.warning[disabled].active,fieldset[disabled] .notification_widget.warning.active{background-color:#f0ad4e;border-color:#eea236}.notification_widget.warning .badge{color:#f0ad4e;background-color:#fff}.notification_widget.success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.notification_widget.success:hover,.notification_widget.success:focus,.notification_widget.success.focus,.notification_widget.success:active,.notification_widget.success.active,.open>.dropdown-toggle.notification_widget.success{color:#fff;background-color:#449d44;border-color:#398439}.notification_widget.success:active,.notification_widget.success.active,.open>.dropdown-toggle.notification_widget.success{background-image:none}.notification_widget.success.disabled,.notification_widget.success[disabled],fieldset[disabled] .notification_widget.success,.notification_widget.success.disabled:hover,.notification_widget.success[disabled]:hover,fieldset[disabled] .notification_widget.success:hover,.notification_widget.success.disabled:focus,.notification_widget.success[disabled]:focus,fieldset[disabled] .notification_widget.success:focus,.notification_widget.success.disabled.focus,.notification_widget.success[disabled].focus,fieldset[disabled] .notification_widget.success.focus,.notification_widget.success.disabled:active,.notification_widget.success[disabled]:active,fieldset[disabled] .notification_widget.success:active,.notification_widget.success.disabled.active,.notification_widget.success[disabled].active,fieldset[disabled] .notification_widget.success.active{background-color:#5cb85c;border-color:#4cae4c}.notification_widget.success .badge{color:#5cb85c;background-color:#fff}.notification_widget.info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.notification_widget.info:hover,.notification_widget.info:focus,.notification_widget.info.focus,.notification_widget.info:active,.notification_widget.info.active,.open>.dropdown-toggle.notification_widget.info{color:#fff;background-color:#31b0d5;border-color:#269abc}.notification_widget.info:active,.notification_widget.info.active,.open>.dropdown-toggle.notification_widget.info{background-image:none}.notification_widget.info.disabled,.notification_widget.info[disabled],fieldset[disabled] .notification_widget.info,.notification_widget.info.disabled:hover,.notification_widget.info[disabled]:hover,fieldset[disabled] .notification_widget.info:hover,.notification_widget.info.disabled:focus,.notification_widget.info[disabled]:focus,fieldset[disabled] .notification_widget.info:focus,.notification_widget.info.disabled.focus,.notification_widget.info[disabled].focus,fieldset[disabled] .notification_widget.info.focus,.notification_widget.info.disabled:active,.notification_widget.info[disabled]:active,fieldset[disabled] .notification_widget.info:active,.notification_widget.info.disabled.active,.notification_widget.info[disabled].active,fieldset[disabled] .notification_widget.info.active{background-color:#5bc0de;border-color:#46b8da}.notification_widget.info .badge{color:#5bc0de;background-color:#fff}.notification_widget.danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.notification_widget.danger:hover,.notification_widget.danger:focus,.notification_widget.danger.focus,.notification_widget.danger:active,.notification_widget.danger.active,.open>.dropdown-toggle.notification_widget.danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.notification_widget.danger:active,.notification_widget.danger.active,.open>.dropdown-toggle.notification_widget.danger{background-image:none}.notification_widget.danger.disabled,.notification_widget.danger[disabled],fieldset[disabled] .notification_widget.danger,.notification_widget.danger.disabled:hover,.notification_widget.danger[disabled]:hover,fieldset[disabled] .notification_widget.danger:hover,.notification_widget.danger.disabled:focus,.notification_widget.danger[disabled]:focus,fieldset[disabled] .notification_widget.danger:focus,.notification_widget.danger.disabled.focus,.notification_widget.danger[disabled].focus,fieldset[disabled] .notification_widget.danger.focus,.notification_widget.danger.disabled:active,.notification_widget.danger[disabled]:active,fieldset[disabled] .notification_widget.danger:active,.notification_widget.danger.disabled.active,.notification_widget.danger[disabled].active,fieldset[disabled] .notification_widget.danger.active{background-color:#d9534f;border-color:#d43f3a}.notification_widget.danger .badge{color:#d9534f;background-color:#fff}div#pager{background-color:#fff;font-size:14px;line-height:20px;overflow:hidden;display:none;position:fixed;bottom:0;width:100%;max-height:50%;padding-top:8px;-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,0.2);box-shadow:0 0 12px 1px rgba(87,87,87,0.2);z-index:100;top:auto !important}div#pager pre{line-height:1.21429em;color:#000;background-color:#f7f7f7;padding:.4em}div#pager #pager-button-area{position:absolute;top:8px;right:20px}div#pager #pager-contents{position:relative;overflow:auto;width:100%;height:100%}div#pager #pager-contents #pager-container{position:relative;padding:15px 0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}div#pager .ui-resizable-handle{top:0;height:8px;background:#f7f7f7;border-top:1px solid #cfcfcf;border-bottom:1px solid #cfcfcf}div#pager .ui-resizable-handle::after{content:'';top:2px;left:50%;height:3px;width:30px;margin-left:-15px;position:absolute;border-top:1px solid #cfcfcf}.quickhelp{display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.shortcut_key{display:inline-block;width:20ex;text-align:right;font-family:monospace}.shortcut_descr{display:inline-block;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}span.save_widget{margin-top:6px}span.save_widget span.filename{height:1em;line-height:1em;padding:3px;margin-left:16px;border:none;font-size:146.5%;border-radius:2px}span.save_widget span.filename:hover{background-color:#e6e6e6}span.checkpoint_status,span.autosave_status{font-size:small}@media (max-width:767px){span.save_widget{font-size:small}span.checkpoint_status,span.autosave_status{display:none}}@media (min-width:768px) and (max-width:991px){span.checkpoint_status{display:none}span.autosave_status{font-size:x-small}}.toolbar{padding:0;margin-left:-5px;margin-top:2px;margin-bottom:5px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.toolbar select,.toolbar label{width:auto;vertical-align:middle;margin-right:2px;margin-bottom:0;display:inline;font-size:92%;margin-left:.3em;margin-right:.3em;padding:0;padding-top:3px}.toolbar .btn{padding:2px 8px}.toolbar .btn-group{margin-top:0;margin-left:5px}#maintoolbar{margin-bottom:-3px;margin-top:-8px;border:0;min-height:27px;margin-left:0;padding-top:11px;padding-bottom:3px}#maintoolbar .navbar-text{float:none;vertical-align:middle;text-align:right;margin-left:5px;margin-right:0;margin-top:0}.select-xs{height:24px}@-moz-keyframes fadeOut{from{opacity:1}to{opacity:0}}@-webkit-keyframes fadeOut{from{opacity:1}to{opacity:0}}@-moz-keyframes fadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeIn{from{opacity:0}to{opacity:1}}.bigtooltip{overflow:auto;height:200px;-webkit-transition-property:height;-webkit-transition-duration:500ms;-moz-transition-property:height;-moz-transition-duration:500ms;transition-property:height;transition-duration:500ms}.smalltooltip{-webkit-transition-property:height;-webkit-transition-duration:500ms;-moz-transition-property:height;-moz-transition-duration:500ms;transition-property:height;transition-duration:500ms;text-overflow:ellipsis;overflow:hidden;height:80px}.tooltipbuttons{position:absolute;padding-right:15px;top:0;right:0}.tooltiptext{padding-right:30px}.ipython_tooltip{max-width:700px;-webkit-animation:fadeOut 400ms;-moz-animation:fadeOut 400ms;animation:fadeOut 400ms;-webkit-animation:fadeIn 400ms;-moz-animation:fadeIn 400ms;animation:fadeIn 400ms;vertical-align:middle;background-color:#f7f7f7;overflow:visible;border:#ababab 1px solid;outline:none;padding:3px;margin:0;padding-left:7px;font-family:monospace;min-height:50px;-moz-box-shadow:0 6px 10px -1px #adadad;-webkit-box-shadow:0 6px 10px -1px #adadad;box-shadow:0 6px 10px -1px #adadad;border-radius:2px;position:absolute;z-index:1000}.ipython_tooltip a{float:right}.ipython_tooltip .tooltiptext pre{border:0;border-radius:0;font-size:100%;background-color:#f7f7f7}.pretooltiparrow{left:0;margin:0;top:-16px;width:40px;height:16px;overflow:hidden;position:absolute}.pretooltiparrow:before{background-color:#f7f7f7;border:1px #ababab solid;z-index:11;content:"";position:absolute;left:15px;top:10px;width:25px;height:25px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg)}.terminal-app{background:#eee}.terminal-app #header{background:#fff;-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,0.2);box-shadow:0 0 12px 1px rgba(87,87,87,0.2)}.terminal-app .terminal{float:left;font-family:monospace;color:white;background:black;padding:.4em;border-radius:2px;-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,0.4);box-shadow:0 0 12px 1px rgba(87,87,87,0.4)}.terminal-app .terminal,.terminal-app .terminal dummy-screen{line-height:1em;font-size:14px}.terminal-app .terminal-cursor{color:black;background:white}.terminal-app #terminado-container{margin-top:20px}/*# sourceMappingURL=style.min.css.map */</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/textcell.js b/ipynb/Array-feature-overlap-05_files/textcell.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..8046c41</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/textcell.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'notebook/js/cell',</span> <span class='diff-add'> 'base/js/security',</span> <span class='diff-add'> 'services/config',</span> <span class='diff-add'> 'notebook/js/mathjaxutils',</span> <span class='diff-add'> 'notebook/js/celltoolbar',</span> <span class='diff-add'> 'components/marked/lib/marked',</span> <span class='diff-add'> 'codemirror/lib/codemirror',</span> <span class='diff-add'> 'codemirror/mode/gfm/gfm',</span> <span class='diff-add'> 'notebook/js/codemirror-ipythongfm'</span> <span class='diff-add'>], function(IPython,</span> <span class='diff-add'> utils,</span> <span class='diff-add'> $,</span> <span class='diff-add'> cell,</span> <span class='diff-add'> security,</span> <span class='diff-add'> configmod,</span> <span class='diff-add'> mathjaxutils,</span> <span class='diff-add'> celltoolbar,</span> <span class='diff-add'> marked,</span> <span class='diff-add'> CodeMirror,</span> <span class='diff-add'> gfm,</span> <span class='diff-add'> ipgfm</span> <span class='diff-add'> ) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var Cell = cell.Cell;</span> <span class='diff-add'> var TextCell = function (options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Constructor</span> <span class='diff-add'> *</span> <span class='diff-add'> * Construct a new TextCell, codemirror mode is by default 'htmlmixed', </span> <span class='diff-add'> * and cell type is 'text' cell start as not redered.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters:</span> <span class='diff-add'> * options: dictionary</span> <span class='diff-add'> * Dictionary of keyword arguments.</span> <span class='diff-add'> * events: $(Events) instance </span> <span class='diff-add'> * config: dictionary</span> <span class='diff-add'> * keyboard_manager: KeyboardManager instance </span> <span class='diff-add'> * notebook: Notebook instance</span> <span class='diff-add'> */</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> // in all TextCell/Cell subclasses</span> <span class='diff-add'> // do not assign most of members here, just pass it down</span> <span class='diff-add'> // in the options dict potentially overwriting what you wish.</span> <span class='diff-add'> // they will be assigned in the base class.</span> <span class='diff-add'> this.notebook = options.notebook;</span> <span class='diff-add'> this.events = options.events;</span> <span class='diff-add'> this.config = options.config;</span> <span class='diff-add'> </span> <span class='diff-add'> // we cannot put this as a class key as it has handle to "this".</span> <span class='diff-add'> var config = utils.mergeopt(TextCell, this.config);</span> <span class='diff-add'> Cell.apply(this, [{</span> <span class='diff-add'> config: config, </span> <span class='diff-add'> keyboard_manager: options.keyboard_manager, </span> <span class='diff-add'> events: this.events}]);</span> <span class='diff-add'> this.cell_type = this.cell_type || 'text';</span> <span class='diff-add'> mathjaxutils = mathjaxutils;</span> <span class='diff-add'> this.rendered = false;</span> <span class='diff-add'> };</span> <span class='diff-add'> TextCell.prototype = Object.create(Cell.prototype);</span> <span class='diff-add'> TextCell.options_default = {</span> <span class='diff-add'> cm_config : {</span> <span class='diff-add'> extraKeys: {"Tab": "indentMore","Shift-Tab" : "indentLess"},</span> <span class='diff-add'> mode: 'htmlmixed',</span> <span class='diff-add'> lineWrapping : true,</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Create the DOM element of the TextCell</span> <span class='diff-add'> * @method create_element</span> <span class='diff-add'> * @private</span> <span class='diff-add'> */</span> <span class='diff-add'> TextCell.prototype.create_element = function () {</span> <span class='diff-add'> Cell.prototype.create_element.apply(this, arguments);</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var cell = $("<div>").addClass('cell text_cell');</span> <span class='diff-add'> cell.attr('tabindex','2');</span> <span class='diff-add'> var prompt = $('<div/>').addClass('prompt input_prompt');</span> <span class='diff-add'> cell.append(prompt);</span> <span class='diff-add'> var inner_cell = $('<div/>').addClass('inner_cell');</span> <span class='diff-add'> this.celltoolbar = new celltoolbar.CellToolbar({</span> <span class='diff-add'> cell: this, </span> <span class='diff-add'> notebook: this.notebook});</span> <span class='diff-add'> inner_cell.append(this.celltoolbar.element);</span> <span class='diff-add'> var input_area = $('<div/>').addClass('input_area');</span> <span class='diff-add'> this.code_mirror = new CodeMirror(input_area.get(0), this.cm_config);</span> <span class='diff-add'> // In case of bugs that put the keyboard manager into an inconsistent state,</span> <span class='diff-add'> // ensure KM is enabled when CodeMirror is focused:</span> <span class='diff-add'> this.code_mirror.on('focus', function () {</span> <span class='diff-add'> if (that.keyboard_manager) {</span> <span class='diff-add'> that.keyboard_manager.enable();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> this.code_mirror.on('keydown', $.proxy(this.handle_keyevent,this))</span> <span class='diff-add'> // The tabindex=-1 makes this div focusable.</span> <span class='diff-add'> var render_area = $('<div/>').addClass('text_cell_render rendered_html')</span> <span class='diff-add'> .attr('tabindex','-1');</span> <span class='diff-add'> inner_cell.append(input_area).append(render_area);</span> <span class='diff-add'> cell.append(inner_cell);</span> <span class='diff-add'> this.element = cell;</span> <span class='diff-add'> };</span> <span class='diff-add'> // Cell level actions</span> <span class='diff-add'> </span> <span class='diff-add'> TextCell.prototype.select = function () {</span> <span class='diff-add'> var cont = Cell.prototype.select.apply(this);</span> <span class='diff-add'> if (cont) {</span> <span class='diff-add'> if (this.mode === 'edit') {</span> <span class='diff-add'> this.code_mirror.refresh();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return cont;</span> <span class='diff-add'> };</span> <span class='diff-add'> TextCell.prototype.unrender = function () {</span> <span class='diff-add'> if (this.read_only) return;</span> <span class='diff-add'> var cont = Cell.prototype.unrender.apply(this);</span> <span class='diff-add'> if (cont) {</span> <span class='diff-add'> var text_cell = this.element;</span> <span class='diff-add'> if (this.get_text() === this.placeholder) {</span> <span class='diff-add'> this.set_text('');</span> <span class='diff-add'> }</span> <span class='diff-add'> this.refresh();</span> <span class='diff-add'> }</span> <span class='diff-add'> return cont;</span> <span class='diff-add'> };</span> <span class='diff-add'> TextCell.prototype.execute = function () {</span> <span class='diff-add'> this.render();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * setter: {{#crossLink "TextCell/set_text"}}{{/crossLink}}</span> <span class='diff-add'> * @method get_text</span> <span class='diff-add'> * @retrun {string} CodeMirror current text value</span> <span class='diff-add'> */</span> <span class='diff-add'> TextCell.prototype.get_text = function() {</span> <span class='diff-add'> return this.code_mirror.getValue();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @param {string} text - Codemiror text value</span> <span class='diff-add'> * @see TextCell#get_text</span> <span class='diff-add'> * @method set_text</span> <span class='diff-add'> * */</span> <span class='diff-add'> TextCell.prototype.set_text = function(text) {</span> <span class='diff-add'> this.code_mirror.setValue(text);</span> <span class='diff-add'> this.unrender();</span> <span class='diff-add'> this.code_mirror.refresh();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * setter :{{#crossLink "TextCell/set_rendered"}}{{/crossLink}}</span> <span class='diff-add'> * @method get_rendered</span> <span class='diff-add'> * */</span> <span class='diff-add'> TextCell.prototype.get_rendered = function() {</span> <span class='diff-add'> return this.element.find('div.text_cell_render').html();</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @method set_rendered</span> <span class='diff-add'> */</span> <span class='diff-add'> TextCell.prototype.set_rendered = function(text) {</span> <span class='diff-add'> this.element.find('div.text_cell_render').html(text);</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Create Text cell from JSON</span> <span class='diff-add'> * @param {json} data - JSON serialized text-cell</span> <span class='diff-add'> * @method fromJSON</span> <span class='diff-add'> */</span> <span class='diff-add'> TextCell.prototype.fromJSON = function (data) {</span> <span class='diff-add'> Cell.prototype.fromJSON.apply(this, arguments);</span> <span class='diff-add'> if (data.cell_type === this.cell_type) {</span> <span class='diff-add'> if (data.source !== undefined) {</span> <span class='diff-add'> this.set_text(data.source);</span> <span class='diff-add'> // make this value the starting point, so that we can only undo</span> <span class='diff-add'> // to this state, instead of a blank cell</span> <span class='diff-add'> this.code_mirror.clearHistory();</span> <span class='diff-add'> // TODO: This HTML needs to be treated as potentially dangerous</span> <span class='diff-add'> // user input and should be handled before set_rendered. </span> <span class='diff-add'> this.set_rendered(data.rendered || '');</span> <span class='diff-add'> this.rendered = false;</span> <span class='diff-add'> this.render();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /** Generate JSON from cell</span> <span class='diff-add'> * @return {object} cell data serialised to json</span> <span class='diff-add'> */</span> <span class='diff-add'> TextCell.prototype.toJSON = function () {</span> <span class='diff-add'> var data = Cell.prototype.toJSON.apply(this);</span> <span class='diff-add'> data.source = this.get_text();</span> <span class='diff-add'> if (data.source == this.placeholder) {</span> <span class='diff-add'> data.source = "";</span> <span class='diff-add'> }</span> <span class='diff-add'> return data;</span> <span class='diff-add'> };</span> <span class='diff-add'> var MarkdownCell = function (options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Constructor</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters:</span> <span class='diff-add'> * options: dictionary</span> <span class='diff-add'> * Dictionary of keyword arguments.</span> <span class='diff-add'> * events: $(Events) instance </span> <span class='diff-add'> * config: ConfigSection instance</span> <span class='diff-add'> * keyboard_manager: KeyboardManager instance </span> <span class='diff-add'> * notebook: Notebook instance</span> <span class='diff-add'> */</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> var config = utils.mergeopt(MarkdownCell, {});</span> <span class='diff-add'> TextCell.apply(this, [$.extend({}, options, {config: config})]);</span> <span class='diff-add'> this.class_config = new configmod.ConfigWithDefaults(options.config,</span> <span class='diff-add'> {}, 'MarkdownCell');</span> <span class='diff-add'> this.cell_type = 'markdown';</span> <span class='diff-add'> };</span> <span class='diff-add'> MarkdownCell.options_default = {</span> <span class='diff-add'> cm_config: {</span> <span class='diff-add'> mode: 'ipythongfm'</span> <span class='diff-add'> },</span> <span class='diff-add'> placeholder: "Type *Markdown* and LaTeX: $\\alpha^2$"</span> <span class='diff-add'> };</span> <span class='diff-add'> MarkdownCell.prototype = Object.create(TextCell.prototype);</span> <span class='diff-add'> MarkdownCell.prototype.set_heading_level = function (level) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * make a markdown cell a heading</span> <span class='diff-add'> */</span> <span class='diff-add'> level = level || 1;</span> <span class='diff-add'> var source = this.get_text();</span> <span class='diff-add'> source = source.replace(/^(#*)\s?/,</span> <span class='diff-add'> new Array(level + 1).join('#') + ' ');</span> <span class='diff-add'> this.set_text(source);</span> <span class='diff-add'> this.refresh();</span> <span class='diff-add'> if (this.rendered) {</span> <span class='diff-add'> this.render();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * @method render</span> <span class='diff-add'> */</span> <span class='diff-add'> MarkdownCell.prototype.render = function () {</span> <span class='diff-add'> var cont = TextCell.prototype.render.apply(this);</span> <span class='diff-add'> if (cont) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var text = this.get_text();</span> <span class='diff-add'> var math = null;</span> <span class='diff-add'> if (text === "") { text = this.placeholder; }</span> <span class='diff-add'> var text_and_math = mathjaxutils.remove_math(text);</span> <span class='diff-add'> text = text_and_math[0];</span> <span class='diff-add'> math = text_and_math[1];</span> <span class='diff-add'> marked(text, function (err, html) {</span> <span class='diff-add'> html = mathjaxutils.replace_math(html, math);</span> <span class='diff-add'> html = security.sanitize_html(html);</span> <span class='diff-add'> html = $($.parseHTML(html));</span> <span class='diff-add'> // add anchors to headings</span> <span class='diff-add'> html.find(":header").addBack(":header").each(function (i, h) {</span> <span class='diff-add'> h = $(h);</span> <span class='diff-add'> var hash = h.text().replace(/ /g, '-');</span> <span class='diff-add'> h.attr('id', hash);</span> <span class='diff-add'> h.append(</span> <span class='diff-add'> $('<a/>')</span> <span class='diff-add'> .addClass('anchor-link')</span> <span class='diff-add'> .attr('href', '#' + hash)</span> <span class='diff-add'> .text('¶')</span> <span class='diff-add'> );</span> <span class='diff-add'> });</span> <span class='diff-add'> // links in markdown cells should open in new tabs</span> <span class='diff-add'> html.find("a[href]").not('[href^="#"]').attr("target", "_blank");</span> <span class='diff-add'> that.set_rendered(html);</span> <span class='diff-add'> that.typeset();</span> <span class='diff-add'> that.events.trigger("rendered.MarkdownCell", {cell: that});</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> return cont;</span> <span class='diff-add'> };</span> <span class='diff-add'> var RawCell = function (options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Constructor</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters:</span> <span class='diff-add'> * options: dictionary</span> <span class='diff-add'> * Dictionary of keyword arguments.</span> <span class='diff-add'> * events: $(Events) instance </span> <span class='diff-add'> * config: ConfigSection instance</span> <span class='diff-add'> * keyboard_manager: KeyboardManager instance </span> <span class='diff-add'> * notebook: Notebook instance</span> <span class='diff-add'> */</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> var config = utils.mergeopt(RawCell, {});</span> <span class='diff-add'> TextCell.apply(this, [$.extend({}, options, {config: config})]);</span> <span class='diff-add'> this.class_config = new configmod.ConfigWithDefaults(options.config,</span> <span class='diff-add'> RawCell.config_defaults, 'RawCell');</span> <span class='diff-add'> this.cell_type = 'raw';</span> <span class='diff-add'> };</span> <span class='diff-add'> RawCell.options_default = {</span> <span class='diff-add'> placeholder : "Write raw LaTeX or other formats here, for use with nbconvert. " +</span> <span class='diff-add'> "It will not be rendered in the notebook. " + </span> <span class='diff-add'> "When passing through nbconvert, a Raw Cell's content is added to the output unmodified."</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> RawCell.config_defaults = {</span> <span class='diff-add'> highlight_modes : {</span> <span class='diff-add'> 'diff' :{'reg':[/^diff/]}</span> <span class='diff-add'> },</span> <span class='diff-add'> };</span> <span class='diff-add'> RawCell.prototype = Object.create(TextCell.prototype);</span> <span class='diff-add'> /** @method bind_events **/</span> <span class='diff-add'> RawCell.prototype.bind_events = function () {</span> <span class='diff-add'> TextCell.prototype.bind_events.apply(this);</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.element.focusout(function() {</span> <span class='diff-add'> that.auto_highlight();</span> <span class='diff-add'> that.render();</span> <span class='diff-add'> });</span> <span class='diff-add'> this.code_mirror.on('focus', function() { that.unrender(); });</span> <span class='diff-add'> };</span> <span class='diff-add'> /** @method render **/</span> <span class='diff-add'> RawCell.prototype.render = function () {</span> <span class='diff-add'> var cont = TextCell.prototype.render.apply(this);</span> <span class='diff-add'> if (cont){</span> <span class='diff-add'> var text = this.get_text();</span> <span class='diff-add'> if (text === "") { text = this.placeholder; }</span> <span class='diff-add'> this.set_text(text);</span> <span class='diff-add'> this.element.removeClass('rendered');</span> <span class='diff-add'> this.auto_highlight();</span> <span class='diff-add'> }</span> <span class='diff-add'> return cont;</span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatability.</span> <span class='diff-add'> IPython.TextCell = TextCell;</span> <span class='diff-add'> IPython.MarkdownCell = MarkdownCell;</span> <span class='diff-add'> IPython.RawCell = RawCell;</span> <span class='diff-add'> var textcell = {</span> <span class='diff-add'> TextCell: TextCell,</span> <span class='diff-add'> MarkdownCell: MarkdownCell,</span> <span class='diff-add'> RawCell: RawCell</span> <span class='diff-add'> };</span> <span class='diff-add'> return textcell;</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/toolbar.js b/ipynb/Array-feature-overlap-05_files/toolbar.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..a008a0d</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/toolbar.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery'</span> <span class='diff-add'>], function(IPython, $) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> /**</span> <span class='diff-add'> * A generic toolbar on which one can add button</span> <span class='diff-add'> * @class ToolBar</span> <span class='diff-add'> * @constructor</span> <span class='diff-add'> * @param {Dom_object} selector</span> <span class='diff-add'> */</span> <span class='diff-add'> var ToolBar = function (selector, options) {</span> <span class='diff-add'> this.selector = selector;</span> <span class='diff-add'> this.actions = (options||{}).actions;</span> <span class='diff-add'> if (this.selector !== undefined) {</span> <span class='diff-add'> this.element = $(selector);</span> <span class='diff-add'> this.style();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> ToolBar.prototype._pseudo_actions={};</span> <span class='diff-add'> ToolBar.prototype.construct = function (config) {</span> <span class='diff-add'> for(var k=0; k<config.length; k++) {</span> <span class='diff-add'> this.add_buttons_group(config[k][0],config[k][1]);</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Add a group of button into the current toolbar.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Use a [dict of [list of action name]] to trigger</span> <span class='diff-add'> * on click to the button</span> <span class='diff-add'> *</span> <span class='diff-add'> * @example</span> <span class='diff-add'> *</span> <span class='diff-add'> * ... todo, maybe use a list of list to keep ordering.</span> <span class='diff-add'> *</span> <span class='diff-add'> * [</span> <span class='diff-add'> * [</span> <span class='diff-add'> * [</span> <span class='diff-add'> * action_name_1,</span> <span class='diff-add'> * action_name_2,</span> <span class='diff-add'> * action_name_3,</span> <span class='diff-add'> * ],</span> <span class='diff-add'> * optional_group_name</span> <span class='diff-add'> * ],</span> <span class='diff-add'> * ...</span> <span class='diff-add'> * ]</span> <span class='diff-add'> *</span> <span class='diff-add'> * For backward compatibility this also support the</span> <span class='diff-add'> * old methods of adding a button directly bound to callbacks:</span> <span class='diff-add'> * @example</span> <span class='diff-add'> * # deprecate, do not use</span> <span class='diff-add'> * IPython.toolbar.add_buttons_group([</span> <span class='diff-add'> * {</span> <span class='diff-add'> * label:'my button',</span> <span class='diff-add'> * icon:'icon-hdd',</span> <span class='diff-add'> * callback:function(){alert('hoho')},</span> <span class='diff-add'> * id : 'my_button_id', // this is optional</span> <span class='diff-add'> * },</span> <span class='diff-add'> * {</span> <span class='diff-add'> * label:'my second button',</span> <span class='diff-add'> * icon:'icon-play',</span> <span class='diff-add'> * callback:function(){alert('be carefull I cut')}</span> <span class='diff-add'> * }</span> <span class='diff-add'> * ],</span> <span class='diff-add'> * "my_button_group_id"</span> <span class='diff-add'> * )</span> <span class='diff-add'> *</span> <span class='diff-add'> * @method add_buttons_group</span> <span class='diff-add'> * @param list {List}</span> <span class='diff-add'> * List of button of the group, with the following paramter for each :</span> <span class='diff-add'> * @param list.label {string} text to show on button hover</span> <span class='diff-add'> * @param list.icon {string} icon to choose from [Font Awesome](http://fortawesome.github.io/Font-Awesome)</span> <span class='diff-add'> * @param list.callback {function} function to be called on button click</span> <span class='diff-add'> * @param [list.id] {String} id to give to the button</span> <span class='diff-add'> * @param [group_id] {String} optionnal id to give to the group</span> <span class='diff-add'> *</span> <span class='diff-add'> *</span> <span class='diff-add'> * for private usage, the key can also be strings starting with '<' and ending with '>' to inject custom element that cannot</span> <span class='diff-add'> * be bound to an action.</span> <span class='diff-add'> *</span> <span class='diff-add'> */</span> <span class='diff-add'> // TODO JUPYTER:</span> <span class='diff-add'> // get rid of legacy code that handle things that are not actions.</span> <span class='diff-add'> ToolBar.prototype.add_buttons_group = function (list, group_id) {</span> <span class='diff-add'> // handle custom call of pseudoaction binding.</span> <span class='diff-add'> if(typeof(list) === 'string' && list.slice(0,1) === '<' && list.slice(-1) === '>'){</span> <span class='diff-add'> var _pseudo_action;</span> <span class='diff-add'> try{</span> <span class='diff-add'> _pseudo_action = list.slice(1,-1);</span> <span class='diff-add'> this.element.append(this._pseudo_actions[_pseudo_action].call(this));</span> <span class='diff-add'> } catch (e) {</span> <span class='diff-add'> console.warn('ouch, calling ', _pseudo_action, 'does not seem to work...:', e);</span> <span class='diff-add'> }</span> <span class='diff-add'> return ;</span> <span class='diff-add'> }</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var btn_group = $('<div/>').addClass("btn-group");</span> <span class='diff-add'> if( group_id !== undefined ) {</span> <span class='diff-add'> btn_group.attr('id',group_id);</span> <span class='diff-add'> }</span> <span class='diff-add'> for(var i=0; i < list.length; i++) {</span> <span class='diff-add'> // IIFE because javascript don't have loop scope so</span> <span class='diff-add'> // action_name would otherwise be the same on all iteration</span> <span class='diff-add'> // of the loop</span> <span class='diff-add'> (function(i,list){</span> <span class='diff-add'> var el = list[i];</span> <span class='diff-add'> var action_name;</span> <span class='diff-add'> var action;</span> <span class='diff-add'> if(typeof(el) === 'string'){</span> <span class='diff-add'> action = that.actions.get(el);</span> <span class='diff-add'> action_name = el;</span> <span class='diff-add'> }</span> <span class='diff-add'> var button = $('<button/>')</span> <span class='diff-add'> .addClass('btn btn-default')</span> <span class='diff-add'> .attr("title", el.label||action.help)</span> <span class='diff-add'> .append(</span> <span class='diff-add'> $("<i/>").addClass(el.icon||action.icon).addClass('fa')</span> <span class='diff-add'> );</span> <span class='diff-add'> var id = el.id;</span> <span class='diff-add'> if( id !== undefined ){</span> <span class='diff-add'> button.attr('id',id);</span> <span class='diff-add'> }</span> <span class='diff-add'> button.attr('data-jupyter-action', action_name);</span> <span class='diff-add'> var fun = el.callback|| function(){</span> <span class='diff-add'> that.actions.call(action_name);</span> <span class='diff-add'> };</span> <span class='diff-add'> button.click(fun);</span> <span class='diff-add'> btn_group.append(button);</span> <span class='diff-add'> })(i,list);</span> <span class='diff-add'> // END IIFE</span> <span class='diff-add'> }</span> <span class='diff-add'> $(this.selector).append(btn_group);</span> <span class='diff-add'> };</span> <span class='diff-add'> ToolBar.prototype.style = function () {</span> <span class='diff-add'> this.element.addClass('toolbar');</span> <span class='diff-add'> };</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Show and hide toolbar</span> <span class='diff-add'> * @method toggle</span> <span class='diff-add'> */</span> <span class='diff-add'> ToolBar.prototype.toggle = function () {</span> <span class='diff-add'> this.element.toggle();</span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatibility.</span> <span class='diff-add'> IPython.ToolBar = ToolBar;</span> <span class='diff-add'> return {'ToolBar': ToolBar};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/tooltip.js b/ipynb/Array-feature-overlap-05_files/tooltip.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..d8c61eb</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/tooltip.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'base/js/utils',</span> <span class='diff-add'>], function(IPython, $, utils) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> // tooltip constructor</span> <span class='diff-add'> var Tooltip = function (events) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.events = events;</span> <span class='diff-add'> this.time_before_tooltip = 1200;</span> <span class='diff-add'> // handle to html</span> <span class='diff-add'> this.tooltip = $('#tooltip');</span> <span class='diff-add'> this._hidden = true;</span> <span class='diff-add'> // variable for consecutive call</span> <span class='diff-add'> this._old_cell = null;</span> <span class='diff-add'> this._old_request = null;</span> <span class='diff-add'> this._consecutive_counter = 0;</span> <span class='diff-add'> // 'sticky ?'</span> <span class='diff-add'> this._sticky = false;</span> <span class='diff-add'> // display tooltip if the docstring is empty?</span> <span class='diff-add'> this._hide_if_no_docstring = false;</span> <span class='diff-add'> // contain the button in the upper right corner</span> <span class='diff-add'> this.buttons = $('<div/>').addClass('tooltipbuttons');</span> <span class='diff-add'> // will contain the docstring</span> <span class='diff-add'> this.text = $('<div/>').addClass('tooltiptext').addClass('smalltooltip');</span> <span class='diff-add'> // build the buttons menu on the upper right</span> <span class='diff-add'> // expand the tooltip to see more</span> <span class='diff-add'> var expandlink = $('<a/>').attr('href', "#").addClass("ui-corner-all") //rounded corner</span> <span class='diff-add'> .attr('role', "button").attr('id', 'expanbutton').attr('title', 'Grow the tooltip vertically (press shift-tab twice)').click(function () {</span> <span class='diff-add'> that.expand();</span> <span class='diff-add'> event.preventDefault();</span> <span class='diff-add'> }).append(</span> <span class='diff-add'> $('<span/>').text('Expand').addClass('ui-icon').addClass('ui-icon-plus'));</span> <span class='diff-add'> // open in pager</span> <span class='diff-add'> var morelink = $('<a/>').attr('href', "#").attr('role', "button").addClass('ui-button').attr('title', 'show the current docstring in pager (press shift-tab 4 times)');</span> <span class='diff-add'> var morespan = $('<span/>').text('Open in Pager').addClass('ui-icon').addClass('ui-icon-arrowstop-l-n');</span> <span class='diff-add'> morelink.append(morespan);</span> <span class='diff-add'> morelink.click(function () {</span> <span class='diff-add'> that.showInPager(that._old_cell);</span> <span class='diff-add'> event.preventDefault();</span> <span class='diff-add'> });</span> <span class='diff-add'> // close the tooltip</span> <span class='diff-add'> var closelink = $('<a/>').attr('href', "#").attr('role', "button").addClass('ui-button');</span> <span class='diff-add'> var closespan = $('<span/>').text('Close').addClass('ui-icon').addClass('ui-icon-close');</span> <span class='diff-add'> closelink.append(closespan);</span> <span class='diff-add'> closelink.click(function () {</span> <span class='diff-add'> that.remove_and_cancel_tooltip(true);</span> <span class='diff-add'> event.preventDefault();</span> <span class='diff-add'> });</span> <span class='diff-add'> this._clocklink = $('<a/>').attr('href', "#");</span> <span class='diff-add'> this._clocklink.attr('role', "button");</span> <span class='diff-add'> this._clocklink.addClass('ui-button');</span> <span class='diff-add'> this._clocklink.attr('title', 'Tooltip is not dismissed while typing for 10 seconds');</span> <span class='diff-add'> var clockspan = $('<span/>').text('Close');</span> <span class='diff-add'> clockspan.addClass('ui-icon');</span> <span class='diff-add'> clockspan.addClass('ui-icon-clock');</span> <span class='diff-add'> this._clocklink.append(clockspan);</span> <span class='diff-add'> this._clocklink.click(function () {</span> <span class='diff-add'> that.cancel_stick();</span> <span class='diff-add'> event.preventDefault();</span> <span class='diff-add'> });</span> <span class='diff-add'> //construct the tooltip</span> <span class='diff-add'> // add in the reverse order you want them to appear</span> <span class='diff-add'> this.buttons.append(closelink);</span> <span class='diff-add'> this.buttons.append(expandlink);</span> <span class='diff-add'> this.buttons.append(morelink);</span> <span class='diff-add'> this.buttons.append(this._clocklink);</span> <span class='diff-add'> this._clocklink.hide();</span> <span class='diff-add'> // we need a phony element to make the small arrow</span> <span class='diff-add'> // of the tooltip in css</span> <span class='diff-add'> // we will move the arrow later</span> <span class='diff-add'> this.arrow = $('<div/>').addClass('pretooltiparrow');</span> <span class='diff-add'> this.tooltip.append(this.buttons);</span> <span class='diff-add'> this.tooltip.append(this.arrow);</span> <span class='diff-add'> this.tooltip.append(this.text);</span> <span class='diff-add'> // function that will be called if you press tab 1, 2, 3... times in a row</span> <span class='diff-add'> this.tabs_functions = [function (cell, text, cursor) {</span> <span class='diff-add'> that._request_tooltip(cell, text, cursor);</span> <span class='diff-add'> }, function () {</span> <span class='diff-add'> that.expand();</span> <span class='diff-add'> }, function () {</span> <span class='diff-add'> that.stick();</span> <span class='diff-add'> }, function (cell) {</span> <span class='diff-add'> that.cancel_stick();</span> <span class='diff-add'> that.showInPager(cell);</span> <span class='diff-add'> }];</span> <span class='diff-add'> // call after all the tabs function above have bee call to clean their effects</span> <span class='diff-add'> // if necessary</span> <span class='diff-add'> this.reset_tabs_function = function (cell, text) {</span> <span class='diff-add'> this._old_cell = (cell) ? cell : null;</span> <span class='diff-add'> this._old_request = (text) ? text : null;</span> <span class='diff-add'> this._consecutive_counter = 0;</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> Tooltip.prototype.is_visible = function () {</span> <span class='diff-add'> return !this._hidden;</span> <span class='diff-add'> };</span> <span class='diff-add'> Tooltip.prototype.showInPager = function (cell) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * reexecute last call in pager by appending ? to show back in pager</span> <span class='diff-add'> */</span> <span class='diff-add'> this.events.trigger('open_with_text.Pager', this._reply.content);</span> <span class='diff-add'> this.remove_and_cancel_tooltip();</span> <span class='diff-add'> };</span> <span class='diff-add'> // grow the tooltip verticaly</span> <span class='diff-add'> Tooltip.prototype.expand = function () {</span> <span class='diff-add'> this.text.removeClass('smalltooltip');</span> <span class='diff-add'> this.text.addClass('bigtooltip');</span> <span class='diff-add'> $('#expanbutton').hide('slow');</span> <span class='diff-add'> };</span> <span class='diff-add'> // deal with all the logic of hiding the tooltip</span> <span class='diff-add'> // and reset it's status</span> <span class='diff-add'> Tooltip.prototype._hide = function () {</span> <span class='diff-add'> this._hidden = true;</span> <span class='diff-add'> this.tooltip.fadeOut('fast');</span> <span class='diff-add'> $('#expanbutton').show('slow');</span> <span class='diff-add'> this.text.removeClass('bigtooltip');</span> <span class='diff-add'> this.text.addClass('smalltooltip');</span> <span class='diff-add'> // keep scroll top to be sure to always see the first line</span> <span class='diff-add'> this.text.scrollTop(0);</span> <span class='diff-add'> this.code_mirror = null;</span> <span class='diff-add'> };</span> <span class='diff-add'> // return true on successfully removing a visible tooltip; otherwise return</span> <span class='diff-add'> // false.</span> <span class='diff-add'> Tooltip.prototype.remove_and_cancel_tooltip = function (force) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * note that we don't handle closing directly inside the calltip</span> <span class='diff-add'> * as in the completer, because it is not focusable, so won't</span> <span class='diff-add'> * get the event.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.cancel_pending();</span> <span class='diff-add'> if (!this._hidden) {</span> <span class='diff-add'> if (force || !this._sticky) {</span> <span class='diff-add'> this.cancel_stick();</span> <span class='diff-add'> this._hide();</span> <span class='diff-add'> }</span> <span class='diff-add'> this.reset_tabs_function();</span> <span class='diff-add'> return true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // cancel autocall done after '(' for example.</span> <span class='diff-add'> Tooltip.prototype.cancel_pending = function () {</span> <span class='diff-add'> if (this._tooltip_timeout !== null) {</span> <span class='diff-add'> clearTimeout(this._tooltip_timeout);</span> <span class='diff-add'> this._tooltip_timeout = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> // will trigger tooltip after timeout</span> <span class='diff-add'> Tooltip.prototype.pending = function (cell, hide_if_no_docstring) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this._tooltip_timeout = setTimeout(function () {</span> <span class='diff-add'> that.request(cell, hide_if_no_docstring);</span> <span class='diff-add'> }, that.time_before_tooltip);</span> <span class='diff-add'> };</span> <span class='diff-add'> // easy access for julia monkey patching.</span> <span class='diff-add'> Tooltip.last_token_re = /[a-z_][0-9a-z._]*$/gi;</span> <span class='diff-add'> Tooltip.prototype._request_tooltip = function (cell, text, cursor_pos) {</span> <span class='diff-add'> var callbacks = $.proxy(this._show, this);</span> <span class='diff-add'> var msg_id = cell.kernel.inspect(text, cursor_pos, callbacks);</span> <span class='diff-add'> };</span> <span class='diff-add'> // make an immediate completion request</span> <span class='diff-add'> Tooltip.prototype.request = function (cell, hide_if_no_docstring) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * request(codecell)</span> <span class='diff-add'> * Deal with extracting the text from the cell and counting</span> <span class='diff-add'> * call in a row</span> <span class='diff-add'> */</span> <span class='diff-add'> this.cancel_pending();</span> <span class='diff-add'> var editor = cell.code_mirror;</span> <span class='diff-add'> var cursor = editor.getCursor();</span> <span class='diff-add'> var cursor_pos = utils.to_absolute_cursor_pos(editor, cursor);</span> <span class='diff-add'> var text = cell.get_text();</span> <span class='diff-add'> this._hide_if_no_docstring = hide_if_no_docstring;</span> <span class='diff-add'> if(editor.somethingSelected()){</span> <span class='diff-add'> // get only the most recent selection.</span> <span class='diff-add'> text = editor.getSelection();</span> <span class='diff-add'> }</span> <span class='diff-add'> // need a permanent handle to code_mirror for future auto recall</span> <span class='diff-add'> this.code_mirror = editor;</span> <span class='diff-add'> // now we treat the different number of keypress</span> <span class='diff-add'> // first if same cell, same text, increment counter by 1</span> <span class='diff-add'> if (this._old_cell == cell && this._old_request == text && this._hidden === false) {</span> <span class='diff-add'> this._consecutive_counter++;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // else reset</span> <span class='diff-add'> this.cancel_stick();</span> <span class='diff-add'> this.reset_tabs_function (cell, text);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.tabs_functions[this._consecutive_counter](cell, text, cursor_pos);</span> <span class='diff-add'> // then if we are at the end of list function, reset</span> <span class='diff-add'> if (this._consecutive_counter == this.tabs_functions.length) {</span> <span class='diff-add'> this.reset_tabs_function (cell, text, cursor);</span> <span class='diff-add'> }</span> <span class='diff-add'> return;</span> <span class='diff-add'> };</span> <span class='diff-add'> // cancel the option of having the tooltip to stick</span> <span class='diff-add'> Tooltip.prototype.cancel_stick = function () {</span> <span class='diff-add'> clearTimeout(this._stick_timeout);</span> <span class='diff-add'> this._stick_timeout = null;</span> <span class='diff-add'> this._clocklink.hide('slow');</span> <span class='diff-add'> this._sticky = false;</span> <span class='diff-add'> };</span> <span class='diff-add'> // put the tooltip in a sicky state for 10 seconds</span> <span class='diff-add'> // it won't be removed by remove_and_cancell() unless you called with</span> <span class='diff-add'> // the first parameter set to true.</span> <span class='diff-add'> // remove_and_cancell_tooltip(true)</span> <span class='diff-add'> Tooltip.prototype.stick = function (time) {</span> <span class='diff-add'> time = (time !== undefined) ? time : 10;</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this._sticky = true;</span> <span class='diff-add'> this._clocklink.show('slow');</span> <span class='diff-add'> this._stick_timeout = setTimeout(function () {</span> <span class='diff-add'> that._sticky = false;</span> <span class='diff-add'> that._clocklink.hide('slow');</span> <span class='diff-add'> }, time * 1000);</span> <span class='diff-add'> };</span> <span class='diff-add'> // should be called with the kernel reply to actually show the tooltip</span> <span class='diff-add'> Tooltip.prototype._show = function (reply) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * move the bubble if it is not hidden</span> <span class='diff-add'> * otherwise fade it</span> <span class='diff-add'> */</span> <span class='diff-add'> this._reply = reply;</span> <span class='diff-add'> var content = reply.content;</span> <span class='diff-add'> if (!content.found) {</span> <span class='diff-add'> // object not found, nothing to show</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.name = content.name;</span> <span class='diff-add'> // do some math to have the tooltip arrow on more or less on left or right</span> <span class='diff-add'> // position of the editor</span> <span class='diff-add'> var cm_pos = $(this.code_mirror.getWrapperElement()).position();</span> <span class='diff-add'> // anchor and head positions are local within CodeMirror element</span> <span class='diff-add'> var anchor = this.code_mirror.cursorCoords(false, 'local');</span> <span class='diff-add'> var head = this.code_mirror.cursorCoords(true, 'local');</span> <span class='diff-add'> // locate the target at the center of anchor, head</span> <span class='diff-add'> var center_left = (head.left + anchor.left) / 2;</span> <span class='diff-add'> // locate the left edge of the tooltip, at most 450 px left of the arrow</span> <span class='diff-add'> var edge_left = Math.max(center_left - 450, 0);</span> <span class='diff-add'> // locate the arrow at the cursor. A 24 px offset seems necessary.</span> <span class='diff-add'> var arrow_left = center_left - edge_left - 24;</span> <span class='diff-add'> </span> <span class='diff-add'> // locate left, top within container element</span> <span class='diff-add'> var left = (cm_pos.left + edge_left) + 'px';</span> <span class='diff-add'> var top = (cm_pos.top + head.bottom + 10) + 'px';</span> <span class='diff-add'> if (this._hidden === false) {</span> <span class='diff-add'> this.tooltip.animate({</span> <span class='diff-add'> left: left,</span> <span class='diff-add'> top: top</span> <span class='diff-add'> });</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.tooltip.css({</span> <span class='diff-add'> left: left</span> <span class='diff-add'> });</span> <span class='diff-add'> this.tooltip.css({</span> <span class='diff-add'> top: top</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> this.arrow.animate({</span> <span class='diff-add'> 'left': arrow_left + 'px'</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> this._hidden = false;</span> <span class='diff-add'> this.tooltip.fadeIn('fast');</span> <span class='diff-add'> this.text.children().remove();</span> <span class='diff-add'> </span> <span class='diff-add'> // This should support rich data types, but only text/plain for now</span> <span class='diff-add'> // Any HTML within the docstring is escaped by the fixConsole() method.</span> <span class='diff-add'> var pre = $('<pre/>').html(utils.fixConsole(content.data['text/plain']));</span> <span class='diff-add'> this.text.append(pre);</span> <span class='diff-add'> // keep scroll top to be sure to always see the first line</span> <span class='diff-add'> this.text.scrollTop(0);</span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatibility.</span> <span class='diff-add'> IPython.Tooltip = Tooltip;</span> <span class='diff-add'> return {'Tooltip': Tooltip};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/tour.js b/ipynb/Array-feature-overlap-05_files/tour.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..78f23cc</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/tour.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'bootstraptour',</span> <span class='diff-add'>], function(IPython, $, Tour) {</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var tour_style = "<div class='popover tour'>\n" +</span> <span class='diff-add'> "<div class='arrow'></div>\n" +</span> <span class='diff-add'> "<div style='position:absolute; top:7px; right:7px'>\n" +</span> <span class='diff-add'> "<button class='btn btn-default btn-sm fa fa-times' data-role='end'></button>\n" +</span> <span class='diff-add'> "</div><h3 class='popover-title'></h3>\n" +</span> <span class='diff-add'> "<div class='popover-content'></div>\n" +</span> <span class='diff-add'> "<div class='popover-navigation'>\n" +</span> <span class='diff-add'> "<button class='btn btn-default fa fa-step-backward' data-role='prev'></button>\n" +</span> <span class='diff-add'> "<button class='btn btn-default fa fa-step-forward pull-right' data-role='next'></button>\n" +</span> <span class='diff-add'> "<button id='tour-pause' class='btn btn-sm btn-default fa fa-pause' data-resume-text='' data-pause-text='' data-role='pause-resume'></button>\n" +</span> <span class='diff-add'> "</div>\n" +</span> <span class='diff-add'> "</div>";</span> <span class='diff-add'> var NotebookTour = function (notebook, events) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.notebook = notebook;</span> <span class='diff-add'> this.step_duration = 0;</span> <span class='diff-add'> this.events = events;</span> <span class='diff-add'> this.tour_steps = [</span> <span class='diff-add'> { </span> <span class='diff-add'> title: "Welcome to the Notebook Tour",</span> <span class='diff-add'> placement: 'bottom',</span> <span class='diff-add'> orphan: true,</span> <span class='diff-add'> content: "You can use the left and right arrow keys to go backwards and forwards."</span> <span class='diff-add'> }, {</span> <span class='diff-add'> element: "#notebook_name",</span> <span class='diff-add'> title: "Filename",</span> <span class='diff-add'> placement: 'bottom',</span> <span class='diff-add'> content: "Click here to change the filename for this notebook."</span> <span class='diff-add'> }, {</span> <span class='diff-add'> element: $("#menus").parent(),</span> <span class='diff-add'> placement: 'bottom',</span> <span class='diff-add'> title: "Notebook Menubar",</span> <span class='diff-add'> content: "The menubar has menus for actions on the notebook, its cells, and the kernel it communicates with."</span> <span class='diff-add'> }, {</span> <span class='diff-add'> element: "#maintoolbar",</span> <span class='diff-add'> placement: 'bottom',</span> <span class='diff-add'> title: "Notebook Toolbar",</span> <span class='diff-add'> content: "The toolbar has buttons for the most common actions. Hover your mouse over each button for more information."</span> <span class='diff-add'> }, {</span> <span class='diff-add'> element: "#modal_indicator",</span> <span class='diff-add'> title: "Mode Indicator",</span> <span class='diff-add'> placement: 'bottom',</span> <span class='diff-add'> content: "The Notebook has two modes: Edit Mode and Command Mode. In this area, an indicator can appear to tell you which mode you are in.",</span> <span class='diff-add'> onShow: function(tour) { that.command_icon_hack(); }</span> <span class='diff-add'> }, {</span> <span class='diff-add'> element: "#modal_indicator",</span> <span class='diff-add'> title: "Command Mode",</span> <span class='diff-add'> placement: 'bottom',</span> <span class='diff-add'> onShow: function(tour) { notebook.command_mode(); that.command_icon_hack(); },</span> <span class='diff-add'> onNext: function(tour) { that.edit_mode(); },</span> <span class='diff-add'> content: "Right now you are in Command Mode, and many keyboard shortcuts are available. In this mode, no icon is displayed in the indicator area."</span> <span class='diff-add'> }, {</span> <span class='diff-add'> element: "#modal_indicator",</span> <span class='diff-add'> title: "Edit Mode",</span> <span class='diff-add'> placement: 'bottom',</span> <span class='diff-add'> onShow: function(tour) { that.edit_mode(); },</span> <span class='diff-add'> content: "Pressing <code>Enter</code> or clicking in the input text area of the cell switches to Edit Mode."</span> <span class='diff-add'> }, {</span> <span class='diff-add'> element: '.selected',</span> <span class='diff-add'> title: "Edit Mode",</span> <span class='diff-add'> placement: 'bottom',</span> <span class='diff-add'> onShow: function(tour) { that.edit_mode(); },</span> <span class='diff-add'> content: "Notice that the border around the currently active cell changed color. Typing will insert text into the currently active cell."</span> <span class='diff-add'> }, {</span> <span class='diff-add'> element: '.selected',</span> <span class='diff-add'> title: "Back to Command Mode",</span> <span class='diff-add'> placement: 'bottom',</span> <span class='diff-add'> onShow: function(tour) { notebook.command_mode(); },</span> <span class='diff-add'> onHide: function(tour) { $('#help_menu').parent().children('a').click(); },</span> <span class='diff-add'> content: "Pressing <code>Esc</code> or clicking outside of the input text area takes you back to Command Mode."</span> <span class='diff-add'> }, {</span> <span class='diff-add'> element: '#keyboard_shortcuts',</span> <span class='diff-add'> title: "Keyboard Shortcuts",</span> <span class='diff-add'> placement: 'bottom',</span> <span class='diff-add'> onHide: function(tour) { $('#help_menu').parent().children('a').click(); },</span> <span class='diff-add'> content: "You can click here to get a list of all of the keyboard shortcuts."</span> <span class='diff-add'> }, {</span> <span class='diff-add'> element: "#kernel_indicator_icon",</span> <span class='diff-add'> title: "Kernel Indicator",</span> <span class='diff-add'> placement: 'bottom',</span> <span class='diff-add'> onShow: function(tour) { events.trigger('kernel_idle.Kernel');},</span> <span class='diff-add'> content: "This is the Kernel indicator. It looks like this when the Kernel is idle."</span> <span class='diff-add'> }, {</span> <span class='diff-add'> element: "#kernel_indicator_icon",</span> <span class='diff-add'> title: "Kernel Indicator",</span> <span class='diff-add'> placement: 'bottom',</span> <span class='diff-add'> onShow: function(tour) { events.trigger('kernel_busy.Kernel'); },</span> <span class='diff-add'> content: "The Kernel indicator looks like this when the Kernel is busy."</span> <span class='diff-add'> }, {</span> <span class='diff-add'> element: ".fa-stop",</span> <span class='diff-add'> placement: 'bottom',</span> <span class='diff-add'> title: "Interrupting the Kernel",</span> <span class='diff-add'> onHide: function(tour) { events.trigger('kernel_idle.Kernel'); },</span> <span class='diff-add'> content: "To cancel a computation in progress, you can click here."</span> <span class='diff-add'> }, {</span> <span class='diff-add'> element: "#notification_kernel",</span> <span class='diff-add'> placement: 'bottom',</span> <span class='diff-add'> onShow: function(tour) { $('.fa-stop').click(); },</span> <span class='diff-add'> title: "Notification Area",</span> <span class='diff-add'> content: "Messages in response to user actions (Save, Interrupt, etc) appear here."</span> <span class='diff-add'> }, {</span> <span class='diff-add'> title: "Fin.",</span> <span class='diff-add'> placement: 'bottom',</span> <span class='diff-add'> orphan: true,</span> <span class='diff-add'> content: "This concludes the IPython Notebook User Interface Tour. Happy hacking!"</span> <span class='diff-add'> }</span> <span class='diff-add'> ];</span> <span class='diff-add'> this.tour = new Tour({</span> <span class='diff-add'> storage: false, // start tour from beginning every time</span> <span class='diff-add'> debug: true,</span> <span class='diff-add'> reflex: true, // click on element to continue tour</span> <span class='diff-add'> animation: false,</span> <span class='diff-add'> duration: this.step_duration,</span> <span class='diff-add'> onStart: function() { console.log('tour started'); },</span> <span class='diff-add'> // TODO: remove the onPause/onResume logic once pi's patch has been</span> <span class='diff-add'> // merged upstream to make this work via data-resume-class and </span> <span class='diff-add'> // data-resume-text attributes.</span> <span class='diff-add'> onPause: this.toggle_pause_play,</span> <span class='diff-add'> onResume: this.toggle_pause_play,</span> <span class='diff-add'> steps: this.tour_steps,</span> <span class='diff-add'> template: tour_style,</span> <span class='diff-add'> orphan: true</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> };</span> <span class='diff-add'> NotebookTour.prototype.start = function () {</span> <span class='diff-add'> console.log("let's start the tour");</span> <span class='diff-add'> this.tour.init();</span> <span class='diff-add'> this.tour.start();</span> <span class='diff-add'> if (this.tour.ended())</span> <span class='diff-add'> {</span> <span class='diff-add'> this.tour.restart();</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> NotebookTour.prototype.command_icon_hack = function() {</span> <span class='diff-add'> $('#modal_indicator').css('min-height', 20);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> NotebookTour.prototype.toggle_pause_play = function () { </span> <span class='diff-add'> $('#tour-pause').toggleClass('fa-pause fa-play'); </span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> NotebookTour.prototype.edit_mode = function() { </span> <span class='diff-add'> this.notebook.focus_cell(); </span> <span class='diff-add'> this.notebook.edit_mode();</span> <span class='diff-add'> };</span> <span class='diff-add'> // For backwards compatability.</span> <span class='diff-add'> IPython.NotebookTour = NotebookTour;</span> <span class='diff-add'> return {'Tour': NotebookTour};</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/underscore-min.js b/ipynb/Array-feature-overlap-05_files/underscore-min.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..d22f881</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/underscore-min.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Underscore.js 1.5.2</span> <span class='diff-add'>// http://underscorejs.org</span> <span class='diff-add'>// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors</span> <span class='diff-add'>// Underscore may be freely distributed under the MIT license.</span> <span class='diff-add'>(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,w=Object.keys,_=i.bind,j=function(n){return n instanceof j?n:this instanceof j?(this._wrapped=n,void 0):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exports._=j):n._=j,j.VERSION="1.5.2";var A=j.each=j.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a=j.keys(n),u=0,i=a.length;i>u;u++)if(t.call(e,n[a[u]],a[u],n)===r)return};j.map=j.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e.push(t.call(r,n,u,i))}),e)};var E="Reduce of empty array with no initial value";j.reduce=j.foldl=j.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=j.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(E);return r},j.reduceRight=j.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=j.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=j.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(E);return r},j.find=j.detect=function(n,t,r){var e;return O(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},j.filter=j.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&e.push(n)}),e)},j.reject=function(n,t,r){return j.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},j.every=j.all=function(n,t,e){t||(t=j.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var O=j.some=j.any=function(n,t,e){t||(t=j.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};j.contains=j.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:O(n,function(n){return n===t})},j.invoke=function(n,t){var r=o.call(arguments,2),e=j.isFunction(t);return j.map(n,function(n){return(e?t:n[t]).apply(n,r)})},j.pluck=function(n,t){return j.map(n,function(n){return n[t]})},j.where=function(n,t,r){return j.isEmpty(t)?r?void 0:[]:j[r?"find":"filter"](n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},j.findWhere=function(n,t){return j.where(n,t,!0)},j.max=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.max.apply(Math,n);if(!t&&j.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>e.computed&&(e={value:n,computed:a})}),e.value},j.min=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.min.apply(Math,n);if(!t&&j.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a<e.computed&&(e={value:n,computed:a})}),e.value},j.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=j.random(r++),e[r-1]=e[t],e[t]=n}),e},j.sample=function(n,t,r){return arguments.length<2||r?n[j.random(n.length-1)]:j.shuffle(n).slice(0,Math.max(0,t))};var k=function(n){return j.isFunction(n)?n:function(t){return t[n]}};j.sortBy=function(n,t,r){var e=k(t);return j.pluck(j.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={},i=null==r?j.identity:k(r);return A(t,function(r,a){var o=i.call(e,r,a,t);n(u,o,r)}),u}};j.groupBy=F(function(n,t,r){(j.has(n,t)?n[t]:n[t]=[]).push(r)}),j.indexBy=F(function(n,t,r){n[t]=r}),j.countBy=F(function(n,t){j.has(n,t)?n[t]++:n[t]=1}),j.sortedIndex=function(n,t,r,e){r=null==r?j.identity:k(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;r.call(e,n[o])<u?i=o+1:a=o}return i},j.toArray=function(n){return n?j.isArray(n)?o.call(n):n.length===+n.length?j.map(n,j.identity):j.values(n):[]},j.size=function(n){return null==n?0:n.length===+n.length?n.length:j.keys(n).length},j.first=j.head=j.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},j.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},j.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},j.rest=j.tail=j.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},j.compact=function(n){return j.filter(n,j.identity)};var M=function(n,t,r){return t&&j.every(n,j.isArray)?c.apply(r,n):(A(n,function(n){j.isArray(n)||j.isArguments(n)?t?a.apply(r,n):M(n,t,r):r.push(n)}),r)};j.flatten=function(n,t){return M(n,t,[])},j.without=function(n){return j.difference(n,o.call(arguments,1))},j.uniq=j.unique=function(n,t,r,e){j.isFunction(t)&&(e=r,r=t,t=!1);var u=r?j.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:j.contains(a,r))||(a.push(r),i.push(n[e]))}),i},j.union=function(){return j.uniq(j.flatten(arguments,!0))},j.intersection=function(n){var t=o.call(arguments,1);return j.filter(j.uniq(n),function(n){return j.every(t,function(t){return j.indexOf(t,n)>=0})})},j.difference=function(n){var t=c.apply(e,o.call(arguments,1));return j.filter(n,function(n){return!j.contains(t,n)})},j.zip=function(){for(var n=j.max(j.pluck(arguments,"length").concat(0)),t=new Array(n),r=0;n>r;r++)t[r]=j.pluck(arguments,""+r);return t},j.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},j.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=j.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},j.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},j.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=new Array(e);e>u;)i[u++]=n,n+=r;return i};var R=function(){};j.bind=function(n,t){var r,e;if(_&&n.bind===_)return _.apply(n,o.call(arguments,1));if(!j.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));R.prototype=n.prototype;var u=new R;R.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},j.partial=function(n){var t=o.call(arguments,1);return function(){return n.apply(this,t.concat(o.call(arguments)))}},j.bindAll=function(n){var t=o.call(arguments,1);if(0===t.length)throw new Error("bindAll must be passed function names");return A(t,function(t){n[t]=j.bind(n[t],n)}),n},j.memoize=function(n,t){var r={};return t||(t=j.identity),function(){var e=t.apply(this,arguments);return j.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},j.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},j.defer=function(n){return j.delay.apply(j,[n,1].concat(o.call(arguments,1)))},j.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var c=function(){o=r.leading===!1?0:new Date,a=null,i=n.apply(e,u)};return function(){var l=new Date;o||r.leading!==!1||(o=l);var f=t-(l-o);return e=this,u=arguments,0>=f?(clearTimeout(a),a=null,o=l,i=n.apply(e,u)):a||r.trailing===!1||(a=setTimeout(c,f)),i}},j.debounce=function(n,t,r){var e,u,i,a,o;return function(){i=this,u=arguments,a=new Date;var c=function(){var l=new Date-a;t>l?e=setTimeout(c,t-l):(e=null,r||(o=n.apply(i,u)))},l=r&&!e;return e||(e=setTimeout(c,t)),l&&(o=n.apply(i,u)),o}},j.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},j.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},j.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},j.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},j.keys=w||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)j.has(n,r)&&t.push(r);return t},j.values=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},j.pairs=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},j.invert=function(n){for(var t={},r=j.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},j.functions=j.methods=function(n){var t=[];for(var r in n)j.isFunction(n[r])&&t.push(r);return t.sort()},j.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},j.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},j.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)j.contains(r,u)||(t[u]=n[u]);return t},j.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]===void 0&&(n[r]=t[r])}),n},j.clone=function(n){return j.isObject(n)?j.isArray(n)?n.slice():j.extend({},n):n},j.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof j&&(n=n._wrapped),t instanceof j&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==String(t);case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;var a=n.constructor,o=t.constructor;if(a!==o&&!(j.isFunction(a)&&a instanceof a&&j.isFunction(o)&&o instanceof o))return!1;r.push(n),e.push(t);var c=0,f=!0;if("[object Array]"==u){if(c=n.length,f=c==t.length)for(;c--&&(f=S(n[c],t[c],r,e)););}else{for(var s in n)if(j.has(n,s)&&(c++,!(f=j.has(t,s)&&S(n[s],t[s],r,e))))break;if(f){for(s in t)if(j.has(t,s)&&!c--)break;f=!c}}return r.pop(),e.pop(),f};j.isEqual=function(n,t){return S(n,t,[],[])},j.isEmpty=function(n){if(null==n)return!0;if(j.isArray(n)||j.isString(n))return 0===n.length;for(var t in n)if(j.has(n,t))return!1;return!0},j.isElement=function(n){return!(!n||1!==n.nodeType)},j.isArray=x||function(n){return"[object Array]"==l.call(n)},j.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){j["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),j.isArguments(arguments)||(j.isArguments=function(n){return!(!n||!j.has(n,"callee"))}),"function"!=typeof/./&&(j.isFunction=function(n){return"function"==typeof n}),j.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},j.isNaN=function(n){return j.isNumber(n)&&n!=+n},j.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},j.isNull=function(n){return null===n},j.isUndefined=function(n){return n===void 0},j.has=function(n,t){return f.call(n,t)},j.noConflict=function(){return n._=t,this},j.identity=function(n){return n},j.times=function(n,t,r){for(var e=Array(Math.max(0,n)),u=0;n>u;u++)e[u]=t.call(r,u);return e},j.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))};var I={escape:{"&":"&","<":"<",">":">",'"':""","'":"'"}};I.unescape=j.invert(I.escape);var T={escape:new RegExp("["+j.keys(I.escape).join("")+"]","g"),unescape:new RegExp("("+j.keys(I.unescape).join("|")+")","g")};j.each(["escape","unescape"],function(n){j[n]=function(t){return null==t?"":(""+t).replace(T[n],function(t){return I[n][t]})}}),j.result=function(n,t){if(null==n)return void 0;var r=n[t];return j.isFunction(r)?r.call(n):r},j.mixin=function(n){A(j.functions(n),function(t){var r=j[t]=n[t];j.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(j,n))}})};var N=0;j.uniqueId=function(n){var t=++N+"";return n?n+t:t},j.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;j.template=function(n,t,r){var e;r=j.defaults({},r,j.templateSettings);var u=new RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(D,function(n){return"\\"+B[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=new Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,j);var c=function(n){return e.call(this,n,j)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},j.chain=function(n){return j(n).chain()};var z=function(n){return this._chain?j(n).chain():n};j.mixin(j),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];j.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];j.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),j.extend(j.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this);</span> <span class='diff-add'>//# sourceMappingURL=underscore-min.map</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/utils.js b/ipynb/Array-feature-overlap-05_files/utils.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..c4659ab</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/utils.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> 'base/js/namespace',</span> <span class='diff-add'> 'jquery',</span> <span class='diff-add'> 'codemirror/lib/codemirror',</span> <span class='diff-add'> 'moment',</span> <span class='diff-add'> // silently upgrades CodeMirror</span> <span class='diff-add'> 'codemirror/mode/meta',</span> <span class='diff-add'>], function(IPython, $, CodeMirror, moment){</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> </span> <span class='diff-add'> var load_extensions = function () {</span> <span class='diff-add'> // load one or more IPython notebook extensions with requirejs</span> <span class='diff-add'> </span> <span class='diff-add'> var extensions = [];</span> <span class='diff-add'> var extension_names = arguments;</span> <span class='diff-add'> for (var i = 0; i < extension_names.length; i++) {</span> <span class='diff-add'> extensions.push("nbextensions/" + arguments[i]);</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> require(extensions,</span> <span class='diff-add'> function () {</span> <span class='diff-add'> for (var i = 0; i < arguments.length; i++) {</span> <span class='diff-add'> var ext = arguments[i];</span> <span class='diff-add'> var ext_name = extension_names[i];</span> <span class='diff-add'> // success callback</span> <span class='diff-add'> console.log("Loaded extension: " + ext_name);</span> <span class='diff-add'> if (ext && ext.load_ipython_extension !== undefined) {</span> <span class='diff-add'> ext.load_ipython_extension();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> function (err) {</span> <span class='diff-add'> // failure callback</span> <span class='diff-add'> console.log("Failed to load extension(s):", err.requireModules, err);</span> <span class='diff-add'> }</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> IPython.load_extensions = load_extensions;</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Wait for a config section to load, and then load the extensions specified</span> <span class='diff-add'> * in a 'load_extensions' key inside it.</span> <span class='diff-add'> */</span> <span class='diff-add'> function load_extensions_from_config(section) {</span> <span class='diff-add'> section.loaded.then(function() {</span> <span class='diff-add'> if (section.data.load_extensions) {</span> <span class='diff-add'> var nbextension_paths = Object.getOwnPropertyNames(</span> <span class='diff-add'> section.data.load_extensions);</span> <span class='diff-add'> load_extensions.apply(this, nbextension_paths);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> //============================================================================</span> <span class='diff-add'> // Cross-browser RegEx Split</span> <span class='diff-add'> //============================================================================</span> <span class='diff-add'> // This code has been MODIFIED from the code licensed below to not replace the</span> <span class='diff-add'> // default browser split. The license is reproduced here.</span> <span class='diff-add'> // see http://blog.stevenlevithan.com/archives/cross-browser-split for more info:</span> <span class='diff-add'> /*!</span> <span class='diff-add'> * Cross-Browser Split 1.1.1</span> <span class='diff-add'> * Copyright 2007-2012 Steven Levithan <stevenlevithan.com></span> <span class='diff-add'> * Available under the MIT License</span> <span class='diff-add'> * ECMAScript compliant, uniform cross-browser split method</span> <span class='diff-add'> */</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Splits a string into an array of strings using a regex or string</span> <span class='diff-add'> * separator. Matches of the separator are not included in the result array.</span> <span class='diff-add'> * However, if `separator` is a regex that contains capturing groups,</span> <span class='diff-add'> * backreferences are spliced into the result each time `separator` is</span> <span class='diff-add'> * matched. Fixes browser bugs compared to the native</span> <span class='diff-add'> * `String.prototype.split` and can be used reliably cross-browser.</span> <span class='diff-add'> * @param {String} str String to split.</span> <span class='diff-add'> * @param {RegExp} separator Regex to use for separating</span> <span class='diff-add'> * the string.</span> <span class='diff-add'> * @param {Number} [limit] Maximum number of items to include in the result</span> <span class='diff-add'> * array.</span> <span class='diff-add'> * @returns {Array} Array of substrings.</span> <span class='diff-add'> * @example</span> <span class='diff-add'> *</span> <span class='diff-add'> * // Basic use</span> <span class='diff-add'> * regex_split('a b c d', ' ');</span> <span class='diff-add'> * // -> ['a', 'b', 'c', 'd']</span> <span class='diff-add'> *</span> <span class='diff-add'> * // With limit</span> <span class='diff-add'> * regex_split('a b c d', ' ', 2);</span> <span class='diff-add'> * // -> ['a', 'b']</span> <span class='diff-add'> *</span> <span class='diff-add'> * // Backreferences in result array</span> <span class='diff-add'> * regex_split('..word1 word2..', /([a-z]+)(\d+)/i);</span> <span class='diff-add'> * // -> ['..', 'word', '1', ' ', 'word', '2', '..']</span> <span class='diff-add'> */</span> <span class='diff-add'> var regex_split = function (str, separator, limit) {</span> <span class='diff-add'> var output = [],</span> <span class='diff-add'> flags = (separator.ignoreCase ? "i" : "") +</span> <span class='diff-add'> (separator.multiline ? "m" : "") +</span> <span class='diff-add'> (separator.extended ? "x" : "") + // Proposed for ES6</span> <span class='diff-add'> (separator.sticky ? "y" : ""), // Firefox 3+</span> <span class='diff-add'> lastLastIndex = 0,</span> <span class='diff-add'> separator2, match, lastIndex, lastLength;</span> <span class='diff-add'> // Make `global` and avoid `lastIndex` issues by working with a copy</span> <span class='diff-add'> separator = new RegExp(separator.source, flags + "g");</span> <span class='diff-add'> var compliantExecNpcg = typeof(/()??/.exec("")[1]) === "undefined";</span> <span class='diff-add'> if (!compliantExecNpcg) {</span> <span class='diff-add'> // Doesn't need flags gy, but they don't hurt</span> <span class='diff-add'> separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags);</span> <span class='diff-add'> }</span> <span class='diff-add'> /* Values for `limit`, per the spec:</span> <span class='diff-add'> * If undefined: 4294967295 // Math.pow(2, 32) - 1</span> <span class='diff-add'> * If 0, Infinity, or NaN: 0</span> <span class='diff-add'> * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;</span> <span class='diff-add'> * If negative number: 4294967296 - Math.floor(Math.abs(limit))</span> <span class='diff-add'> * If other: Type-convert, then use the above rules</span> <span class='diff-add'> */</span> <span class='diff-add'> limit = typeof(limit) === "undefined" ?</span> <span class='diff-add'> -1 >>> 0 : // Math.pow(2, 32) - 1</span> <span class='diff-add'> limit >>> 0; // ToUint32(limit)</span> <span class='diff-add'> for (match = separator.exec(str); match; match = separator.exec(str)) {</span> <span class='diff-add'> // `separator.lastIndex` is not reliable cross-browser</span> <span class='diff-add'> lastIndex = match.index + match[0].length;</span> <span class='diff-add'> if (lastIndex > lastLastIndex) {</span> <span class='diff-add'> output.push(str.slice(lastLastIndex, match.index));</span> <span class='diff-add'> // Fix browsers whose `exec` methods don't consistently return `undefined` for</span> <span class='diff-add'> // nonparticipating capturing groups</span> <span class='diff-add'> if (!compliantExecNpcg && match.length > 1) {</span> <span class='diff-add'> match[0].replace(separator2, function () {</span> <span class='diff-add'> for (var i = 1; i < arguments.length - 2; i++) {</span> <span class='diff-add'> if (typeof(arguments[i]) === "undefined") {</span> <span class='diff-add'> match[i] = undefined;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> if (match.length > 1 && match.index < str.length) {</span> <span class='diff-add'> Array.prototype.push.apply(output, match.slice(1));</span> <span class='diff-add'> }</span> <span class='diff-add'> lastLength = match[0].length;</span> <span class='diff-add'> lastLastIndex = lastIndex;</span> <span class='diff-add'> if (output.length >= limit) {</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (separator.lastIndex === match.index) {</span> <span class='diff-add'> separator.lastIndex++; // Avoid an infinite loop</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> if (lastLastIndex === str.length) {</span> <span class='diff-add'> if (lastLength || !separator.test("")) {</span> <span class='diff-add'> output.push("");</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> output.push(str.slice(lastLastIndex));</span> <span class='diff-add'> }</span> <span class='diff-add'> return output.length > limit ? output.slice(0, limit) : output;</span> <span class='diff-add'> };</span> <span class='diff-add'> //============================================================================</span> <span class='diff-add'> // End contributed Cross-browser RegEx Split</span> <span class='diff-add'> //============================================================================</span> <span class='diff-add'> var uuid = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * http://www.ietf.org/rfc/rfc4122.txt</span> <span class='diff-add'> */</span> <span class='diff-add'> var s = [];</span> <span class='diff-add'> var hexDigits = "0123456789ABCDEF";</span> <span class='diff-add'> for (var i = 0; i < 32; i++) {</span> <span class='diff-add'> s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);</span> <span class='diff-add'> }</span> <span class='diff-add'> s[12] = "4"; // bits 12-15 of the time_hi_and_version field to 0010</span> <span class='diff-add'> s[16] = hexDigits.substr((s[16] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01</span> <span class='diff-add'> var uuid = s.join("");</span> <span class='diff-add'> return uuid;</span> <span class='diff-add'> };</span> <span class='diff-add'> //Fix raw text to parse correctly in crazy XML</span> <span class='diff-add'> function xmlencode(string) {</span> <span class='diff-add'> return string.replace(/\&/g,'&'+'amp;')</span> <span class='diff-add'> .replace(/</g,'&'+'lt;')</span> <span class='diff-add'> .replace(/>/g,'&'+'gt;')</span> <span class='diff-add'> .replace(/\'/g,'&'+'apos;')</span> <span class='diff-add'> .replace(/\"/g,'&'+'quot;')</span> <span class='diff-add'> .replace(/`/g,'&'+'#96;');</span> <span class='diff-add'> }</span> <span class='diff-add'> //Map from terminal commands to CSS classes</span> <span class='diff-add'> var ansi_colormap = {</span> <span class='diff-add'> "01":"ansibold",</span> <span class='diff-add'> </span> <span class='diff-add'> "30":"ansiblack",</span> <span class='diff-add'> "31":"ansired",</span> <span class='diff-add'> "32":"ansigreen",</span> <span class='diff-add'> "33":"ansiyellow",</span> <span class='diff-add'> "34":"ansiblue",</span> <span class='diff-add'> "35":"ansipurple",</span> <span class='diff-add'> "36":"ansicyan",</span> <span class='diff-add'> "37":"ansigray",</span> <span class='diff-add'> </span> <span class='diff-add'> "40":"ansibgblack",</span> <span class='diff-add'> "41":"ansibgred",</span> <span class='diff-add'> "42":"ansibggreen",</span> <span class='diff-add'> "43":"ansibgyellow",</span> <span class='diff-add'> "44":"ansibgblue",</span> <span class='diff-add'> "45":"ansibgpurple",</span> <span class='diff-add'> "46":"ansibgcyan",</span> <span class='diff-add'> "47":"ansibggray"</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> function _process_numbers(attrs, numbers) {</span> <span class='diff-add'> // process ansi escapes</span> <span class='diff-add'> var n = numbers.shift();</span> <span class='diff-add'> if (ansi_colormap[n]) {</span> <span class='diff-add'> if ( ! attrs["class"] ) {</span> <span class='diff-add'> attrs["class"] = ansi_colormap[n];</span> <span class='diff-add'> } else {</span> <span class='diff-add'> attrs["class"] += " " + ansi_colormap[n];</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (n == "38" || n == "48") {</span> <span class='diff-add'> // VT100 256 color or 24 bit RGB</span> <span class='diff-add'> if (numbers.length < 2) {</span> <span class='diff-add'> console.log("Not enough fields for VT100 color", numbers);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> var index_or_rgb = numbers.shift();</span> <span class='diff-add'> var r,g,b;</span> <span class='diff-add'> if (index_or_rgb == "5") {</span> <span class='diff-add'> // 256 color</span> <span class='diff-add'> var idx = parseInt(numbers.shift(), 10);</span> <span class='diff-add'> if (idx < 16) {</span> <span class='diff-add'> // indexed ANSI</span> <span class='diff-add'> // ignore bright / non-bright distinction</span> <span class='diff-add'> idx = idx % 8;</span> <span class='diff-add'> var ansiclass = ansi_colormap[n[0] + (idx % 8).toString()];</span> <span class='diff-add'> if ( ! attrs["class"] ) {</span> <span class='diff-add'> attrs["class"] = ansiclass;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> attrs["class"] += " " + ansiclass;</span> <span class='diff-add'> }</span> <span class='diff-add'> return;</span> <span class='diff-add'> } else if (idx < 232) {</span> <span class='diff-add'> // 216 color 6x6x6 RGB</span> <span class='diff-add'> idx = idx - 16;</span> <span class='diff-add'> b = idx % 6;</span> <span class='diff-add'> g = Math.floor(idx / 6) % 6;</span> <span class='diff-add'> r = Math.floor(idx / 36) % 6;</span> <span class='diff-add'> // convert to rgb</span> <span class='diff-add'> r = (r * 51);</span> <span class='diff-add'> g = (g * 51);</span> <span class='diff-add'> b = (b * 51);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // grayscale</span> <span class='diff-add'> idx = idx - 231;</span> <span class='diff-add'> // it's 1-24 and should *not* include black or white,</span> <span class='diff-add'> // so a 26 point scale</span> <span class='diff-add'> r = g = b = Math.floor(idx * 256 / 26);</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (index_or_rgb == "2") {</span> <span class='diff-add'> // Simple 24 bit RGB</span> <span class='diff-add'> if (numbers.length > 3) {</span> <span class='diff-add'> console.log("Not enough fields for RGB", numbers);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> r = numbers.shift();</span> <span class='diff-add'> g = numbers.shift();</span> <span class='diff-add'> b = numbers.shift();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> console.log("unrecognized control", numbers);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (r !== undefined) {</span> <span class='diff-add'> // apply the rgb color</span> <span class='diff-add'> var line;</span> <span class='diff-add'> if (n == "38") {</span> <span class='diff-add'> line = "color: ";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> line = "background-color: ";</span> <span class='diff-add'> }</span> <span class='diff-add'> line = line + "rgb(" + r + "," + g + "," + b + ");";</span> <span class='diff-add'> if ( !attrs.style ) {</span> <span class='diff-add'> attrs.style = line;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> attrs.style += " " + line;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function ansispan(str) {</span> <span class='diff-add'> // ansispan function adapted from github.com/mmalecki/ansispan (MIT License)</span> <span class='diff-add'> // regular ansi escapes (using the table above)</span> <span class='diff-add'> var is_open = false;</span> <span class='diff-add'> return str.replace(/\033\[(0?[01]|22|39)?([;\d]+)?m/g, function(match, prefix, pattern) {</span> <span class='diff-add'> if (!pattern) {</span> <span class='diff-add'> // [(01|22|39|)m close spans</span> <span class='diff-add'> if (is_open) {</span> <span class='diff-add'> is_open = false;</span> <span class='diff-add'> return "</span>";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return "";</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> is_open = true;</span> <span class='diff-add'> // consume sequence of color escapes</span> <span class='diff-add'> var numbers = pattern.match(/\d+/g);</span> <span class='diff-add'> var attrs = {};</span> <span class='diff-add'> while (numbers.length > 0) {</span> <span class='diff-add'> _process_numbers(attrs, numbers);</span> <span class='diff-add'> }</span> <span class='diff-add'> var span = "<span ";</span> <span class='diff-add'> Object.keys(attrs).map(function (attr) {</span> <span class='diff-add'> span = span + " " + attr + '="' + attrs[attr] + '"';</span> <span class='diff-add'> });</span> <span class='diff-add'> return span + ">";</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> // Transform ANSI color escape codes into HTML <span> tags with css</span> <span class='diff-add'> // classes listed in the above ansi_colormap object. The actual color used</span> <span class='diff-add'> // are set in the css file.</span> <span class='diff-add'> function fixConsole(txt) {</span> <span class='diff-add'> txt = xmlencode(txt);</span> <span class='diff-add'> // Strip all ANSI codes that are not color related. Matches</span> <span class='diff-add'> // all ANSI codes that do not end with "m".</span> <span class='diff-add'> var ignored_re = /(?=(\033\[[\d;=]*[a-ln-zA-Z]{1}))\1(?!m)/g;</span> <span class='diff-add'> txt = txt.replace(ignored_re, "");</span> <span class='diff-add'> </span> <span class='diff-add'> // color ansi codes</span> <span class='diff-add'> txt = ansispan(txt);</span> <span class='diff-add'> return txt;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Remove chunks that should be overridden by the effect of</span> <span class='diff-add'> // carriage return characters</span> <span class='diff-add'> function fixCarriageReturn(txt) {</span> <span class='diff-add'> var tmp = txt;</span> <span class='diff-add'> do {</span> <span class='diff-add'> txt = tmp;</span> <span class='diff-add'> tmp = txt.replace(/\r+\n/gm, '\n'); // \r followed by \n --> newline</span> <span class='diff-add'> tmp = tmp.replace(/^.*\r+/gm, ''); // Other \r --> clear line</span> <span class='diff-add'> } while (tmp.length < txt.length);</span> <span class='diff-add'> return txt;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Locate any URLs and convert them to a anchor tag</span> <span class='diff-add'> function autoLinkUrls(txt) {</span> <span class='diff-add'> return txt.replace(/(^|\s)(https?|ftp)(:[^'">\s]+)/gi,</span> <span class='diff-add'> "$1<a target=\"_blank\" href=\"$2$3\">$2$3</a>");</span> <span class='diff-add'> }</span> <span class='diff-add'> var points_to_pixels = function (points) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * A reasonably good way of converting between points and pixels.</span> <span class='diff-add'> */</span> <span class='diff-add'> var test = $('<div style="display: none; width: 10000pt; padding:0; border:0;"></div>');</span> <span class='diff-add'> $('body').append(test);</span> <span class='diff-add'> var pixel_per_point = test.width()/10000;</span> <span class='diff-add'> test.remove();</span> <span class='diff-add'> return Math.floor(points*pixel_per_point);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var always_new = function (constructor) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * wrapper around contructor to avoid requiring `var a = new constructor()`</span> <span class='diff-add'> * useful for passing constructors as callbacks,</span> <span class='diff-add'> * not for programmer laziness.</span> <span class='diff-add'> * from http://programmers.stackexchange.com/questions/118798</span> <span class='diff-add'> */</span> <span class='diff-add'> return function () {</span> <span class='diff-add'> var obj = Object.create(constructor.prototype);</span> <span class='diff-add'> constructor.apply(obj, arguments);</span> <span class='diff-add'> return obj;</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> var url_path_join = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * join a sequence of url components with '/'</span> <span class='diff-add'> */</span> <span class='diff-add'> var url = '';</span> <span class='diff-add'> for (var i = 0; i < arguments.length; i++) {</span> <span class='diff-add'> if (arguments[i] === '') {</span> <span class='diff-add'> continue;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (url.length > 0 && url[url.length-1] != '/') {</span> <span class='diff-add'> url = url + '/' + arguments[i];</span> <span class='diff-add'> } else {</span> <span class='diff-add'> url = url + arguments[i];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> url = url.replace(/\/\/+/, '/');</span> <span class='diff-add'> return url;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var url_path_split = function (path) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Like os.path.split for URLs.</span> <span class='diff-add'> * Always returns two strings, the directory path and the base filename</span> <span class='diff-add'> */</span> <span class='diff-add'> </span> <span class='diff-add'> var idx = path.lastIndexOf('/');</span> <span class='diff-add'> if (idx === -1) {</span> <span class='diff-add'> return ['', path];</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return [ path.slice(0, idx), path.slice(idx + 1) ];</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var parse_url = function (url) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * an `a` element with an href allows attr-access to the parsed segments of a URL</span> <span class='diff-add'> * a = parse_url("http://localhost:8888/path/name#hash")</span> <span class='diff-add'> * a.protocol = "http:"</span> <span class='diff-add'> * a.host = "localhost:8888"</span> <span class='diff-add'> * a.hostname = "localhost"</span> <span class='diff-add'> * a.port = 8888</span> <span class='diff-add'> * a.pathname = "/path/name"</span> <span class='diff-add'> * a.hash = "#hash"</span> <span class='diff-add'> */</span> <span class='diff-add'> var a = document.createElement("a");</span> <span class='diff-add'> a.href = url;</span> <span class='diff-add'> return a;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var encode_uri_components = function (uri) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * encode just the components of a multi-segment uri,</span> <span class='diff-add'> * leaving '/' separators</span> <span class='diff-add'> */</span> <span class='diff-add'> return uri.split('/').map(encodeURIComponent).join('/');</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var url_join_encode = function () {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * join a sequence of url components with '/',</span> <span class='diff-add'> * encoding each component with encodeURIComponent</span> <span class='diff-add'> */</span> <span class='diff-add'> return encode_uri_components(url_path_join.apply(null, arguments));</span> <span class='diff-add'> };</span> <span class='diff-add'> var splitext = function (filename) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * mimic Python os.path.splitext</span> <span class='diff-add'> * Returns ['base', '.ext']</span> <span class='diff-add'> */</span> <span class='diff-add'> var idx = filename.lastIndexOf('.');</span> <span class='diff-add'> if (idx > 0) {</span> <span class='diff-add'> return [filename.slice(0, idx), filename.slice(idx)];</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return [filename, ''];</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var escape_html = function (text) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * escape text to HTML</span> <span class='diff-add'> */</span> <span class='diff-add'> return $("<div/>").text(text).html();</span> <span class='diff-add'> };</span> <span class='diff-add'> var get_body_data = function(key) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * get a url-encoded item from body.data and decode it</span> <span class='diff-add'> * we should never have any encoded URLs anywhere else in code</span> <span class='diff-add'> * until we are building an actual request</span> <span class='diff-add'> */</span> <span class='diff-add'> var val = $('body').data(key);</span> <span class='diff-add'> if (!val)</span> <span class='diff-add'> return val;</span> <span class='diff-add'> return decodeURIComponent(val);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var to_absolute_cursor_pos = function (cm, cursor) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * get the absolute cursor position from CodeMirror's col, ch</span> <span class='diff-add'> */</span> <span class='diff-add'> if (!cursor) {</span> <span class='diff-add'> cursor = cm.getCursor();</span> <span class='diff-add'> }</span> <span class='diff-add'> var cursor_pos = cursor.ch;</span> <span class='diff-add'> for (var i = 0; i < cursor.line; i++) {</span> <span class='diff-add'> cursor_pos += cm.getLine(i).length + 1;</span> <span class='diff-add'> }</span> <span class='diff-add'> return cursor_pos;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var from_absolute_cursor_pos = function (cm, cursor_pos) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * turn absolute cursor postion into CodeMirror col, ch cursor</span> <span class='diff-add'> */</span> <span class='diff-add'> var i, line;</span> <span class='diff-add'> var offset = 0;</span> <span class='diff-add'> for (i = 0, line=cm.getLine(i); line !== undefined; i++, line=cm.getLine(i)) {</span> <span class='diff-add'> if (offset + line.length < cursor_pos) {</span> <span class='diff-add'> offset += line.length + 1;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return {</span> <span class='diff-add'> line : i,</span> <span class='diff-add'> ch : cursor_pos - offset,</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // reached end, return endpoint</span> <span class='diff-add'> return {</span> <span class='diff-add'> ch : line.length - 1,</span> <span class='diff-add'> line : i - 1,</span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> // http://stackoverflow.com/questions/2400935/browser-detection-in-javascript</span> <span class='diff-add'> var browser = (function() {</span> <span class='diff-add'> if (typeof navigator === 'undefined') {</span> <span class='diff-add'> // navigator undefined in node</span> <span class='diff-add'> return 'None';</span> <span class='diff-add'> }</span> <span class='diff-add'> var N= navigator.appName, ua= navigator.userAgent, tem;</span> <span class='diff-add'> var M= ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);</span> <span class='diff-add'> if (M && (tem= ua.match(/version\/([\.\d]+)/i)) !== null) M[2]= tem[1];</span> <span class='diff-add'> M= M? [M[1], M[2]]: [N, navigator.appVersion,'-?'];</span> <span class='diff-add'> return M;</span> <span class='diff-add'> })();</span> <span class='diff-add'> // http://stackoverflow.com/questions/11219582/how-to-detect-my-browser-version-and-operating-system-using-javascript</span> <span class='diff-add'> var platform = (function () {</span> <span class='diff-add'> if (typeof navigator === 'undefined') {</span> <span class='diff-add'> // navigator undefined in node</span> <span class='diff-add'> return 'None';</span> <span class='diff-add'> }</span> <span class='diff-add'> var OSName="None";</span> <span class='diff-add'> if (navigator.appVersion.indexOf("Win")!=-1) OSName="Windows";</span> <span class='diff-add'> if (navigator.appVersion.indexOf("Mac")!=-1) OSName="MacOS";</span> <span class='diff-add'> if (navigator.appVersion.indexOf("X11")!=-1) OSName="UNIX";</span> <span class='diff-add'> if (navigator.appVersion.indexOf("Linux")!=-1) OSName="Linux";</span> <span class='diff-add'> return OSName;</span> <span class='diff-add'> })();</span> <span class='diff-add'> </span> <span class='diff-add'> var get_url_param = function (name) {</span> <span class='diff-add'> // get a URL parameter. I cannot believe we actually need this.</span> <span class='diff-add'> // Based on http://stackoverflow.com/a/25359264/938949</span> <span class='diff-add'> var match = new RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);</span> <span class='diff-add'> if (match){</span> <span class='diff-add'> return decodeURIComponent(match[1] || '');</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var is_or_has = function (a, b) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Is b a child of a or a itself?</span> <span class='diff-add'> */</span> <span class='diff-add'> return a.has(b).length !==0 || a.is(b);</span> <span class='diff-add'> };</span> <span class='diff-add'> var is_focused = function (e) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Is element e, or one of its children focused?</span> <span class='diff-add'> */</span> <span class='diff-add'> e = $(e);</span> <span class='diff-add'> var target = $(document.activeElement);</span> <span class='diff-add'> if (target.length > 0) {</span> <span class='diff-add'> if (is_or_has(e, target)) {</span> <span class='diff-add'> return true;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var mergeopt = function(_class, options, overwrite){</span> <span class='diff-add'> options = options || {};</span> <span class='diff-add'> overwrite = overwrite || {};</span> <span class='diff-add'> return $.extend(true, {}, _class.options_default, options, overwrite);</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var ajax_error_msg = function (jqXHR) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Return a JSON error message if there is one,</span> <span class='diff-add'> * otherwise the basic HTTP status text.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (jqXHR.responseJSON && jqXHR.responseJSON.traceback) {</span> <span class='diff-add'> return jqXHR.responseJSON.traceback;</span> <span class='diff-add'> } else if (jqXHR.responseJSON && jqXHR.responseJSON.message) {</span> <span class='diff-add'> return jqXHR.responseJSON.message;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return jqXHR.statusText;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> var log_ajax_error = function (jqXHR, status, error) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * log ajax failures with informative messages</span> <span class='diff-add'> */</span> <span class='diff-add'> var msg = "API request failed (" + jqXHR.status + "): ";</span> <span class='diff-add'> console.log(jqXHR);</span> <span class='diff-add'> msg += ajax_error_msg(jqXHR);</span> <span class='diff-add'> console.log(msg);</span> <span class='diff-add'> };</span> <span class='diff-add'> var requireCodeMirrorMode = function (mode, callback, errback) {</span> <span class='diff-add'> /** </span> <span class='diff-add'> * find a predefined mode or detect from CM metadata then</span> <span class='diff-add'> * require and callback with the resolveable mode string: mime or</span> <span class='diff-add'> * custom name</span> <span class='diff-add'> */</span> <span class='diff-add'> var modename = (typeof mode == "string") ? mode :</span> <span class='diff-add'> mode.mode || mode.name;</span> <span class='diff-add'> // simplest, cheapest check by mode name: mode may also have config</span> <span class='diff-add'> if (CodeMirror.modes.hasOwnProperty(modename)) {</span> <span class='diff-add'> // return the full mode object, if it has a name</span> <span class='diff-add'> callback(mode.name ? mode : modename);</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> // *somehow* get back a CM.modeInfo-like object that has .mode and</span> <span class='diff-add'> // .mime</span> <span class='diff-add'> var info = (mode && mode.mode && mode.mime && mode) ||</span> <span class='diff-add'> CodeMirror.findModeByName(modename) ||</span> <span class='diff-add'> CodeMirror.findModeByExtension(modename.split(".").slice(-1)) ||</span> <span class='diff-add'> CodeMirror.findModeByMIME(modename) ||</span> <span class='diff-add'> {mode: modename, mime: modename};</span> <span class='diff-add'> require([</span> <span class='diff-add'> // might want to use CodeMirror.modeURL here</span> <span class='diff-add'> ['codemirror/mode', info.mode, info.mode].join('/'),</span> <span class='diff-add'> ], function() {</span> <span class='diff-add'> // return the original mode, as from a kernelspec on first load</span> <span class='diff-add'> // or the mimetype, as for most highlighting</span> <span class='diff-add'> callback(mode.name ? mode : info.mime);</span> <span class='diff-add'> }, errback</span> <span class='diff-add'> );</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> /** Error type for wrapped XHR errors. */</span> <span class='diff-add'> var XHR_ERROR = 'XhrError';</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Wraps an AJAX error as an Error object.</span> <span class='diff-add'> */</span> <span class='diff-add'> var wrap_ajax_error = function (jqXHR, status, error) {</span> <span class='diff-add'> var wrapped_error = new Error(ajax_error_msg(jqXHR));</span> <span class='diff-add'> wrapped_error.name = XHR_ERROR;</span> <span class='diff-add'> // provide xhr response</span> <span class='diff-add'> wrapped_error.xhr = jqXHR;</span> <span class='diff-add'> wrapped_error.xhr_status = status;</span> <span class='diff-add'> wrapped_error.xhr_error = error;</span> <span class='diff-add'> return wrapped_error;</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var promising_ajax = function(url, settings) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Like $.ajax, but returning an ES6 promise. success and error settings</span> <span class='diff-add'> * will be ignored.</span> <span class='diff-add'> */</span> <span class='diff-add'> settings = settings || {};</span> <span class='diff-add'> return new Promise(function(resolve, reject) {</span> <span class='diff-add'> settings.success = function(data, status, jqXHR) {</span> <span class='diff-add'> resolve(data);</span> <span class='diff-add'> };</span> <span class='diff-add'> settings.error = function(jqXHR, status, error) {</span> <span class='diff-add'> log_ajax_error(jqXHR, status, error);</span> <span class='diff-add'> reject(wrap_ajax_error(jqXHR, status, error));</span> <span class='diff-add'> };</span> <span class='diff-add'> $.ajax(url, settings);</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> var WrappedError = function(message, error){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Wrappable Error class</span> <span class='diff-add'> *</span> <span class='diff-add'> * The Error class doesn't actually act on `this`. Instead it always</span> <span class='diff-add'> * returns a new instance of Error. Here we capture that instance so we</span> <span class='diff-add'> * can apply it's properties to `this`.</span> <span class='diff-add'> */</span> <span class='diff-add'> var tmp = Error.apply(this, [message]);</span> <span class='diff-add'> // Copy the properties of the error over to this.</span> <span class='diff-add'> var properties = Object.getOwnPropertyNames(tmp);</span> <span class='diff-add'> for (var i = 0; i < properties.length; i++) {</span> <span class='diff-add'> this[properties[i]] = tmp[properties[i]];</span> <span class='diff-add'> }</span> <span class='diff-add'> // Keep a stack of the original error messages.</span> <span class='diff-add'> if (error instanceof WrappedError) {</span> <span class='diff-add'> this.error_stack = error.error_stack;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.error_stack = [error];</span> <span class='diff-add'> }</span> <span class='diff-add'> this.error_stack.push(tmp);</span> <span class='diff-add'> return this;</span> <span class='diff-add'> };</span> <span class='diff-add'> WrappedError.prototype = Object.create(Error.prototype, {});</span> <span class='diff-add'> var load_class = function(class_name, module_name, registry) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Tries to load a class</span> <span class='diff-add'> *</span> <span class='diff-add'> * Tries to load a class from a module using require.js, if a module </span> <span class='diff-add'> * is specified, otherwise tries to load a class from the global </span> <span class='diff-add'> * registry, if the global registry is provided.</span> <span class='diff-add'> */</span> <span class='diff-add'> return new Promise(function(resolve, reject) {</span> <span class='diff-add'> // Try loading the view module using require.js</span> <span class='diff-add'> if (module_name) {</span> <span class='diff-add'> require([module_name], function(module) {</span> <span class='diff-add'> if (module[class_name] === undefined) {</span> <span class='diff-add'> reject(new Error('Class '+class_name+' not found in module '+module_name));</span> <span class='diff-add'> } else {</span> <span class='diff-add'> resolve(module[class_name]);</span> <span class='diff-add'> }</span> <span class='diff-add'> }, reject);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> if (registry && registry[class_name]) {</span> <span class='diff-add'> resolve(registry[class_name]);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> reject(new Error('Class '+class_name+' not found in registry '));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> var resolve_promises_dict = function(d) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Resolve a promiseful dictionary.</span> <span class='diff-add'> * Returns a single Promise.</span> <span class='diff-add'> */</span> <span class='diff-add'> var keys = Object.keys(d);</span> <span class='diff-add'> var values = [];</span> <span class='diff-add'> keys.forEach(function(key) {</span> <span class='diff-add'> values.push(d[key]);</span> <span class='diff-add'> });</span> <span class='diff-add'> return Promise.all(values).then(function(v) {</span> <span class='diff-add'> d = {};</span> <span class='diff-add'> for(var i=0; i<keys.length; i++) {</span> <span class='diff-add'> d[keys[i]] = v[i];</span> <span class='diff-add'> }</span> <span class='diff-add'> return d;</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> var reject = function(message, log) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Creates a wrappable Promise rejection function.</span> <span class='diff-add'> * </span> <span class='diff-add'> * Creates a function that returns a Promise.reject with a new WrappedError</span> <span class='diff-add'> * that has the provided message and wraps the original error that </span> <span class='diff-add'> * caused the promise to reject.</span> <span class='diff-add'> */</span> <span class='diff-add'> return function(error) { </span> <span class='diff-add'> var wrapped_error = new WrappedError(message, error);</span> <span class='diff-add'> if (log) console.error(wrapped_error); </span> <span class='diff-add'> return Promise.reject(wrapped_error); </span> <span class='diff-add'> };</span> <span class='diff-add'> };</span> <span class='diff-add'> var typeset = function(element, text) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Apply MathJax rendering to an element, and optionally set its text</span> <span class='diff-add'> *</span> <span class='diff-add'> * If MathJax is not available, make no changes.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Returns the output any number of typeset elements, or undefined if</span> <span class='diff-add'> * MathJax was not available.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters</span> <span class='diff-add'> * ----------</span> <span class='diff-add'> * element: Node, NodeList, or jQuery selection</span> <span class='diff-add'> * text: option string</span> <span class='diff-add'> */</span> <span class='diff-add'> var $el = element.jquery ? element : $(element);</span> <span class='diff-add'> if(arguments.length > 1){</span> <span class='diff-add'> $el.text(text);</span> <span class='diff-add'> }</span> <span class='diff-add'> if(!window.MathJax){</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> return $el.map(function(){</span> <span class='diff-add'> // MathJax takes a DOM node: $.map makes `this` the context</span> <span class='diff-add'> return MathJax.Hub.Queue(["Typeset", MathJax.Hub, this]);</span> <span class='diff-add'> });</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var time = {};</span> <span class='diff-add'> time.milliseconds = {};</span> <span class='diff-add'> time.milliseconds.s = 1000;</span> <span class='diff-add'> time.milliseconds.m = 60 * time.milliseconds.s;</span> <span class='diff-add'> time.milliseconds.h = 60 * time.milliseconds.m;</span> <span class='diff-add'> time.milliseconds.d = 24 * time.milliseconds.h;</span> <span class='diff-add'> </span> <span class='diff-add'> time.thresholds = {</span> <span class='diff-add'> // moment.js thresholds in milliseconds</span> <span class='diff-add'> s: moment.relativeTimeThreshold('s') * time.milliseconds.s,</span> <span class='diff-add'> m: moment.relativeTimeThreshold('m') * time.milliseconds.m,</span> <span class='diff-add'> h: moment.relativeTimeThreshold('h') * time.milliseconds.h,</span> <span class='diff-add'> d: moment.relativeTimeThreshold('d') * time.milliseconds.d,</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> time.timeout_from_dt = function (dt) {</span> <span class='diff-add'> /** compute a timeout based on dt</span> <span class='diff-add'> </span> <span class='diff-add'> input and output both in milliseconds</span> <span class='diff-add'> </span> <span class='diff-add'> use moment's relative time thresholds:</span> <span class='diff-add'> </span> <span class='diff-add'> - 10 seconds if in 'seconds ago' territory</span> <span class='diff-add'> - 1 minute if in 'minutes ago'</span> <span class='diff-add'> - 1 hour otherwise</span> <span class='diff-add'> */</span> <span class='diff-add'> if (dt < time.thresholds.s) {</span> <span class='diff-add'> return 10 * time.milliseconds.s;</span> <span class='diff-add'> } else if (dt < time.thresholds.m) {</span> <span class='diff-add'> return time.milliseconds.m;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return time.milliseconds.h;</span> <span class='diff-add'> }</span> <span class='diff-add'> };</span> <span class='diff-add'> </span> <span class='diff-add'> var utils = {</span> <span class='diff-add'> load_extensions: load_extensions,</span> <span class='diff-add'> load_extensions_from_config: load_extensions_from_config,</span> <span class='diff-add'> regex_split : regex_split,</span> <span class='diff-add'> uuid : uuid,</span> <span class='diff-add'> fixConsole : fixConsole,</span> <span class='diff-add'> fixCarriageReturn : fixCarriageReturn,</span> <span class='diff-add'> autoLinkUrls : autoLinkUrls,</span> <span class='diff-add'> points_to_pixels : points_to_pixels,</span> <span class='diff-add'> get_body_data : get_body_data,</span> <span class='diff-add'> parse_url : parse_url,</span> <span class='diff-add'> url_path_split : url_path_split,</span> <span class='diff-add'> url_path_join : url_path_join,</span> <span class='diff-add'> url_join_encode : url_join_encode,</span> <span class='diff-add'> encode_uri_components : encode_uri_components,</span> <span class='diff-add'> splitext : splitext,</span> <span class='diff-add'> escape_html : escape_html,</span> <span class='diff-add'> always_new : always_new,</span> <span class='diff-add'> to_absolute_cursor_pos : to_absolute_cursor_pos,</span> <span class='diff-add'> from_absolute_cursor_pos : from_absolute_cursor_pos,</span> <span class='diff-add'> browser : browser,</span> <span class='diff-add'> platform: platform,</span> <span class='diff-add'> get_url_param: get_url_param,</span> <span class='diff-add'> is_or_has : is_or_has,</span> <span class='diff-add'> is_focused : is_focused,</span> <span class='diff-add'> mergeopt: mergeopt,</span> <span class='diff-add'> ajax_error_msg : ajax_error_msg,</span> <span class='diff-add'> log_ajax_error : log_ajax_error,</span> <span class='diff-add'> requireCodeMirrorMode : requireCodeMirrorMode,</span> <span class='diff-add'> XHR_ERROR : XHR_ERROR,</span> <span class='diff-add'> wrap_ajax_error : wrap_ajax_error,</span> <span class='diff-add'> promising_ajax : promising_ajax,</span> <span class='diff-add'> WrappedError: WrappedError,</span> <span class='diff-add'> load_class: load_class,</span> <span class='diff-add'> resolve_promises_dict: resolve_promises_dict,</span> <span class='diff-add'> reject: reject,</span> <span class='diff-add'> typeset: typeset,</span> <span class='diff-add'> time: time,</span> <span class='diff-add'> };</span> <span class='diff-add'> // Backwards compatability.</span> <span class='diff-add'> IPython.utils = utils;</span> <span class='diff-add'> </span> <span class='diff-add'> return utils;</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget.js b/ipynb/Array-feature-overlap-05_files/widget.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..e5f758d</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define(["widgets/js/manager",</span> <span class='diff-add'> "underscore",</span> <span class='diff-add'> "backbone",</span> <span class='diff-add'> "jquery",</span> <span class='diff-add'> "base/js/utils",</span> <span class='diff-add'> "base/js/namespace",</span> <span class='diff-add'>], function(widgetmanager, _, Backbone, $, utils, IPython){</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var WidgetModel = Backbone.Model.extend({</span> <span class='diff-add'> constructor: function (widget_manager, model_id, comm) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Constructor</span> <span class='diff-add'> *</span> <span class='diff-add'> * Creates a WidgetModel instance.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters</span> <span class='diff-add'> * ----------</span> <span class='diff-add'> * widget_manager : WidgetManager instance</span> <span class='diff-add'> * model_id : string</span> <span class='diff-add'> * An ID unique to this model.</span> <span class='diff-add'> * comm : Comm instance (optional)</span> <span class='diff-add'> */</span> <span class='diff-add'> this.widget_manager = widget_manager;</span> <span class='diff-add'> this.state_change = Promise.resolve();</span> <span class='diff-add'> this._buffered_state_diff = {};</span> <span class='diff-add'> this.pending_msgs = 0;</span> <span class='diff-add'> this.msg_buffer = null;</span> <span class='diff-add'> this.state_lock = null;</span> <span class='diff-add'> this.id = model_id;</span> <span class='diff-add'> this.views = {};</span> <span class='diff-add'> this._resolve_received_state = {};</span> <span class='diff-add'> if (comm !== undefined) {</span> <span class='diff-add'> // Remember comm associated with the model.</span> <span class='diff-add'> this.comm = comm;</span> <span class='diff-add'> comm.model = this;</span> <span class='diff-add'> // Hook comm messages up to model.</span> <span class='diff-add'> comm.on_close($.proxy(this._handle_comm_closed, this));</span> <span class='diff-add'> comm.on_msg($.proxy(this._handle_comm_msg, this));</span> <span class='diff-add'> // Assume the comm is alive.</span> <span class='diff-add'> this.set_comm_live(true);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.set_comm_live(false);</span> <span class='diff-add'> }</span> <span class='diff-add'> // Listen for the events that lead to the websocket being terminated.</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var died = function() {</span> <span class='diff-add'> that.set_comm_live(false);</span> <span class='diff-add'> };</span> <span class='diff-add'> widget_manager.notebook.events.on('kernel_disconnected.Kernel', died);</span> <span class='diff-add'> widget_manager.notebook.events.on('kernel_killed.Kernel', died);</span> <span class='diff-add'> widget_manager.notebook.events.on('kernel_restarting.Kernel', died);</span> <span class='diff-add'> widget_manager.notebook.events.on('kernel_dead.Kernel', died);</span> <span class='diff-add'> return Backbone.Model.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> send: function (content, callbacks) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Send a custom msg over the comm.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (this.comm !== undefined) {</span> <span class='diff-add'> var data = {method: 'custom', content: content};</span> <span class='diff-add'> this.comm.send(data, callbacks);</span> <span class='diff-add'> this.pending_msgs++;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> request_state: function(callbacks) {</span> <span class='diff-add'> /** </span> <span class='diff-add'> * Request a state push from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (!this.comm) {</span> <span class='diff-add'> console.error("Could not request_state because comm doesn't exist!");</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> var msg_id = this.comm.send({method: 'request_state'}, callbacks || this.widget_manager.callbacks());</span> <span class='diff-add'> // Promise that is resolved when a state is received</span> <span class='diff-add'> // from the back-end.</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var received_state = new Promise(function(resolve) {</span> <span class='diff-add'> that._resolve_received_state[msg_id] = resolve;</span> <span class='diff-add'> });</span> <span class='diff-add'> return received_state;</span> <span class='diff-add'> },</span> <span class='diff-add'> set_comm_live: function(live) {</span> <span class='diff-add'> /** </span> <span class='diff-add'> * Change the comm_live state of the model.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (this.comm_live === undefined || this.comm_live != live) {</span> <span class='diff-add'> this.comm_live = live;</span> <span class='diff-add'> this.trigger(live ? 'comm:live' : 'comm:dead', {model: this});</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> close: function(comm_closed) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Close model</span> <span class='diff-add'> */</span> <span class='diff-add'> if (this.comm && !comm_closed) {</span> <span class='diff-add'> this.comm.close();</span> <span class='diff-add'> }</span> <span class='diff-add'> this.stopListening();</span> <span class='diff-add'> this.trigger('destroy', this);</span> <span class='diff-add'> delete this.comm.model; // Delete ref so GC will collect widget model.</span> <span class='diff-add'> delete this.comm;</span> <span class='diff-add'> delete this.model_id; // Delete id from model so widget manager cleans up.</span> <span class='diff-add'> _.each(this.views, function(v, id, views) {</span> <span class='diff-add'> v.then(function(view) {</span> <span class='diff-add'> view.remove();</span> <span class='diff-add'> delete views[id];</span> <span class='diff-add'> });</span> <span class='diff-add'> });</span> <span class='diff-add'> },</span> <span class='diff-add'> _handle_comm_closed: function (msg) {</span> <span class='diff-add'> /** </span> <span class='diff-add'> * Handle when a widget is closed.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.trigger('comm:close');</span> <span class='diff-add'> this.close(true);</span> <span class='diff-add'> },</span> <span class='diff-add'> _handle_comm_msg: function (msg) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle incoming comm msg.</span> <span class='diff-add'> */</span> <span class='diff-add'> var method = msg.content.data.method;</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> switch (method) {</span> <span class='diff-add'> case 'update':</span> <span class='diff-add'> this.state_change = this.state_change</span> <span class='diff-add'> .then(function() {</span> <span class='diff-add'> return that.set_state(msg.content.data.state);</span> <span class='diff-add'> }).catch(utils.reject("Couldn't process update msg for model id '" + String(that.id) + "'", true))</span> <span class='diff-add'> .then(function() {</span> <span class='diff-add'> var parent_id = msg.parent_header.msg_id;</span> <span class='diff-add'> if (that._resolve_received_state[parent_id] !== undefined) {</span> <span class='diff-add'> that._resolve_received_state[parent_id].call();</span> <span class='diff-add'> delete that._resolve_received_state[parent_id];</span> <span class='diff-add'> }</span> <span class='diff-add'> }).catch(utils.reject("Couldn't resolve state request promise", true));</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'custom':</span> <span class='diff-add'> this.trigger('msg:custom', msg.content.data.content);</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'display':</span> <span class='diff-add'> this.state_change = this.state_change.then(function() {</span> <span class='diff-add'> that.widget_manager.display_view(msg, that);</span> <span class='diff-add'> }).catch(utils.reject('Could not process display view msg', true));</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> set_state: function (state) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> // Handle when a widget is updated via the python side.</span> <span class='diff-add'> return this._unpack_models(state).then(function(state) {</span> <span class='diff-add'> that.state_lock = state;</span> <span class='diff-add'> try {</span> <span class='diff-add'> WidgetModel.__super__.set.call(that, state);</span> <span class='diff-add'> } finally {</span> <span class='diff-add'> that.state_lock = null;</span> <span class='diff-add'> }</span> <span class='diff-add'> }).catch(utils.reject("Couldn't set model state", true));</span> <span class='diff-add'> },</span> <span class='diff-add'> get_state: function() {</span> <span class='diff-add'> // Get the serializable state of the model.</span> <span class='diff-add'> var state = this.toJSON();</span> <span class='diff-add'> for (var key in state) {</span> <span class='diff-add'> if (state.hasOwnProperty(key)) {</span> <span class='diff-add'> state[key] = this._pack_models(state[key]);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return state;</span> <span class='diff-add'> },</span> <span class='diff-add'> _handle_status: function (msg, callbacks) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle status msgs.</span> <span class='diff-add'> *</span> <span class='diff-add'> * execution_state : ('busy', 'idle', 'starting')</span> <span class='diff-add'> */</span> <span class='diff-add'> if (this.comm !== undefined) {</span> <span class='diff-add'> if (msg.content.execution_state ==='idle') {</span> <span class='diff-add'> // Send buffer if this message caused another message to be</span> <span class='diff-add'> // throttled.</span> <span class='diff-add'> if (this.msg_buffer !== null &&</span> <span class='diff-add'> (this.get('msg_throttle') || 3) === this.pending_msgs) {</span> <span class='diff-add'> var data = {method: 'backbone', sync_method: 'update', sync_data: this.msg_buffer};</span> <span class='diff-add'> this.comm.send(data, callbacks);</span> <span class='diff-add'> this.msg_buffer = null;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> --this.pending_msgs;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> callbacks: function(view) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Create msg callbacks for a comm msg.</span> <span class='diff-add'> */</span> <span class='diff-add'> var callbacks = this.widget_manager.callbacks(view);</span> <span class='diff-add'> if (callbacks.iopub === undefined) {</span> <span class='diff-add'> callbacks.iopub = {};</span> <span class='diff-add'> }</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> callbacks.iopub.status = function (msg) {</span> <span class='diff-add'> that._handle_status(msg, callbacks);</span> <span class='diff-add'> };</span> <span class='diff-add'> return callbacks;</span> <span class='diff-add'> },</span> <span class='diff-add'> set: function(key, val, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a value.</span> <span class='diff-add'> */</span> <span class='diff-add'> var return_value = WidgetModel.__super__.set.apply(this, arguments);</span> <span class='diff-add'> // Backbone only remembers the diff of the most recent set()</span> <span class='diff-add'> // operation. Calling set multiple times in a row results in a </span> <span class='diff-add'> // loss of diff information. Here we keep our own running diff.</span> <span class='diff-add'> this._buffered_state_diff = $.extend(this._buffered_state_diff, this.changedAttributes() || {});</span> <span class='diff-add'> return return_value;</span> <span class='diff-add'> },</span> <span class='diff-add'> sync: function (method, model, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle sync to the back-end. Called when a model.save() is called.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Make sure a comm exists.</span> <span class='diff-add'> */</span> <span class='diff-add'> var error = options.error || function() {</span> <span class='diff-add'> console.error('Backbone sync error:', arguments);</span> <span class='diff-add'> };</span> <span class='diff-add'> if (this.comm === undefined) {</span> <span class='diff-add'> error();</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> // Delete any key value pairs that the back-end already knows about.</span> <span class='diff-add'> var attrs = (method === 'patch') ? options.attrs : model.toJSON(options);</span> <span class='diff-add'> if (this.state_lock !== null) {</span> <span class='diff-add'> var keys = Object.keys(this.state_lock);</span> <span class='diff-add'> for (var i=0; i<keys.length; i++) {</span> <span class='diff-add'> var key = keys[i];</span> <span class='diff-add'> if (attrs[key] === this.state_lock[key]) {</span> <span class='diff-add'> delete attrs[key];</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Only sync if there are attributes to send to the back-end.</span> <span class='diff-add'> attrs = this._pack_models(attrs);</span> <span class='diff-add'> if (_.size(attrs) > 0) {</span> <span class='diff-add'> // If this message was sent via backbone itself, it will not</span> <span class='diff-add'> // have any callbacks. It's important that we create callbacks</span> <span class='diff-add'> // so we can listen for status messages, etc...</span> <span class='diff-add'> var callbacks = options.callbacks || this.callbacks();</span> <span class='diff-add'> // Check throttle.</span> <span class='diff-add'> if (this.pending_msgs >= (this.get('msg_throttle') || 3)) {</span> <span class='diff-add'> // The throttle has been exceeded, buffer the current msg so</span> <span class='diff-add'> // it can be sent once the kernel has finished processing </span> <span class='diff-add'> // some of the existing messages.</span> <span class='diff-add'> </span> <span class='diff-add'> // Combine updates if it is a 'patch' sync, otherwise replace updates</span> <span class='diff-add'> switch (method) {</span> <span class='diff-add'> case 'patch':</span> <span class='diff-add'> this.msg_buffer = $.extend(this.msg_buffer || {}, attrs);</span> <span class='diff-add'> break;</span> <span class='diff-add'> case 'update':</span> <span class='diff-add'> case 'create':</span> <span class='diff-add'> this.msg_buffer = attrs;</span> <span class='diff-add'> break;</span> <span class='diff-add'> default:</span> <span class='diff-add'> error();</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> this.msg_buffer_callbacks = callbacks;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // We haven't exceeded the throttle, send the message like </span> <span class='diff-add'> // normal.</span> <span class='diff-add'> var data = {method: 'backbone', sync_data: attrs};</span> <span class='diff-add'> this.comm.send(data, callbacks);</span> <span class='diff-add'> this.pending_msgs++;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> // Since the comm is a one-way communication, assume the message </span> <span class='diff-add'> // arrived. Don't call success since we don't have a model back from the server</span> <span class='diff-add'> // this means we miss out on the 'sync' event.</span> <span class='diff-add'> this._buffered_state_diff = {};</span> <span class='diff-add'> },</span> <span class='diff-add'> save_changes: function(callbacks) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Push this model's state to the back-end</span> <span class='diff-add'> *</span> <span class='diff-add'> * This invokes a Backbone.Sync.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.save(this._buffered_state_diff, {patch: true, callbacks: callbacks});</span> <span class='diff-add'> },</span> <span class='diff-add'> _pack_models: function(value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Replace models with model ids recursively.</span> <span class='diff-add'> */</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var packed;</span> <span class='diff-add'> if (value instanceof Backbone.Model) {</span> <span class='diff-add'> return "IPY_MODEL_" + value.id;</span> <span class='diff-add'> } else if ($.isArray(value)) {</span> <span class='diff-add'> packed = [];</span> <span class='diff-add'> _.each(value, function(sub_value, key) {</span> <span class='diff-add'> packed.push(that._pack_models(sub_value));</span> <span class='diff-add'> });</span> <span class='diff-add'> return packed;</span> <span class='diff-add'> } else if (value instanceof Date || value instanceof String) {</span> <span class='diff-add'> return value;</span> <span class='diff-add'> } else if (value instanceof Object) {</span> <span class='diff-add'> packed = {};</span> <span class='diff-add'> _.each(value, function(sub_value, key) {</span> <span class='diff-add'> packed[key] = that._pack_models(sub_value);</span> <span class='diff-add'> });</span> <span class='diff-add'> return packed;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return value;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> _unpack_models: function(value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Replace model ids with models recursively.</span> <span class='diff-add'> */</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var unpacked;</span> <span class='diff-add'> if ($.isArray(value)) {</span> <span class='diff-add'> unpacked = [];</span> <span class='diff-add'> _.each(value, function(sub_value, key) {</span> <span class='diff-add'> unpacked.push(that._unpack_models(sub_value));</span> <span class='diff-add'> });</span> <span class='diff-add'> return Promise.all(unpacked);</span> <span class='diff-add'> } else if (value instanceof Object) {</span> <span class='diff-add'> unpacked = {};</span> <span class='diff-add'> _.each(value, function(sub_value, key) {</span> <span class='diff-add'> unpacked[key] = that._unpack_models(sub_value);</span> <span class='diff-add'> });</span> <span class='diff-add'> return utils.resolve_promises_dict(unpacked);</span> <span class='diff-add'> } else if (typeof value === 'string' && value.slice(0,10) === "IPY_MODEL_") {</span> <span class='diff-add'> // get_model returns a promise already</span> <span class='diff-add'> return this.widget_manager.get_model(value.slice(10, value.length));</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return Promise.resolve(value);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> on_some_change: function(keys, callback, context) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * on_some_change(["key1", "key2"], foo, context) differs from</span> <span class='diff-add'> * on("change:key1 change:key2", foo, context).</span> <span class='diff-add'> * If the widget attributes key1 and key2 are both modified, </span> <span class='diff-add'> * the second form will result in foo being called twice</span> <span class='diff-add'> * while the first will call foo only once.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.on('change', function() {</span> <span class='diff-add'> if (keys.some(this.hasChanged, this)) {</span> <span class='diff-add'> callback.apply(context);</span> <span class='diff-add'> }</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> widgetmanager.WidgetManager.register_widget_model('WidgetModel', WidgetModel);</span> <span class='diff-add'> var WidgetView = Backbone.View.extend({</span> <span class='diff-add'> initialize: function(parameters) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Public constructor.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.model.on('change',this.update,this);</span> <span class='diff-add'> // Bubble the comm live events.</span> <span class='diff-add'> this.model.on('comm:live', function() {</span> <span class='diff-add'> this.trigger('comm:live', this);</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.model.on('comm:dead', function() {</span> <span class='diff-add'> this.trigger('comm:dead', this);</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.options = parameters.options;</span> <span class='diff-add'> this.on('displayed', function() { </span> <span class='diff-add'> this.is_displayed = true; </span> <span class='diff-add'> }, this);</span> <span class='diff-add'> },</span> <span class='diff-add'> update: function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Triggered on model change.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Update view to be consistent with this.model</span> <span class='diff-add'> */</span> <span class='diff-add'> },</span> <span class='diff-add'> create_child_view: function(child_model, options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Create and promise that resolves to a child view of a given model</span> <span class='diff-add'> */</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> options = $.extend({ parent: this }, options || {});</span> <span class='diff-add'> return this.model.widget_manager.create_view(child_model, options).catch(utils.reject("Couldn't create child view"), true);</span> <span class='diff-add'> },</span> <span class='diff-add'> callbacks: function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Create msg callbacks for a comm msg.</span> <span class='diff-add'> */</span> <span class='diff-add'> return this.model.callbacks(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> render: function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Render the view.</span> <span class='diff-add'> *</span> <span class='diff-add'> * By default, this is only called the first time the view is created</span> <span class='diff-add'> */</span> <span class='diff-add'> },</span> <span class='diff-add'> send: function (content) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Send a custom msg associated with this view.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.model.send(content, this.callbacks());</span> <span class='diff-add'> },</span> <span class='diff-add'> touch: function () {</span> <span class='diff-add'> this.model.save_changes(this.callbacks());</span> <span class='diff-add'> },</span> <span class='diff-add'> after_displayed: function (callback, context) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Calls the callback right away is the view is already displayed</span> <span class='diff-add'> * otherwise, register the callback to the 'displayed' event.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (this.is_displayed) {</span> <span class='diff-add'> callback.apply(context);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.on('displayed', callback, context);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> remove: function () {</span> <span class='diff-add'> // Raise a remove event when the view is removed.</span> <span class='diff-add'> WidgetView.__super__.remove.apply(this, arguments);</span> <span class='diff-add'> this.trigger('remove');</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> var DOMWidgetView = WidgetView.extend({</span> <span class='diff-add'> initialize: function (parameters) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Public constructor</span> <span class='diff-add'> */</span> <span class='diff-add'> DOMWidgetView.__super__.initialize.apply(this, [parameters]);</span> <span class='diff-add'> this.model.on('change:visible', this.update_visible, this);</span> <span class='diff-add'> this.model.on('change:_css', this.update_css, this);</span> <span class='diff-add'> this.model.on('change:_dom_classes', function(model, new_classes) {</span> <span class='diff-add'> var old_classes = model.previous('_dom_classes');</span> <span class='diff-add'> this.update_classes(old_classes, new_classes);</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.model.on('change:color', function (model, value) { </span> <span class='diff-add'> this.update_attr('color', value); }, this);</span> <span class='diff-add'> this.model.on('change:background_color', function (model, value) { </span> <span class='diff-add'> this.update_attr('background', value); }, this);</span> <span class='diff-add'> this.model.on('change:width', function (model, value) { </span> <span class='diff-add'> this.update_attr('width', value); }, this);</span> <span class='diff-add'> this.model.on('change:height', function (model, value) { </span> <span class='diff-add'> this.update_attr('height', value); }, this);</span> <span class='diff-add'> this.model.on('change:border_color', function (model, value) { </span> <span class='diff-add'> this.update_attr('border-color', value); }, this);</span> <span class='diff-add'> this.model.on('change:border_width', function (model, value) { </span> <span class='diff-add'> this.update_attr('border-width', value); }, this);</span> <span class='diff-add'> this.model.on('change:border_style', function (model, value) { </span> <span class='diff-add'> this.update_attr('border-style', value); }, this);</span> <span class='diff-add'> this.model.on('change:font_style', function (model, value) { </span> <span class='diff-add'> this.update_attr('font-style', value); }, this);</span> <span class='diff-add'> this.model.on('change:font_weight', function (model, value) { </span> <span class='diff-add'> this.update_attr('font-weight', value); }, this);</span> <span class='diff-add'> this.model.on('change:font_size', function (model, value) { </span> <span class='diff-add'> this.update_attr('font-size', this._default_px(value)); }, this);</span> <span class='diff-add'> this.model.on('change:font_family', function (model, value) { </span> <span class='diff-add'> this.update_attr('font-family', value); }, this);</span> <span class='diff-add'> this.model.on('change:padding', function (model, value) { </span> <span class='diff-add'> this.update_attr('padding', value); }, this);</span> <span class='diff-add'> this.model.on('change:margin', function (model, value) { </span> <span class='diff-add'> this.update_attr('margin', this._default_px(value)); }, this);</span> <span class='diff-add'> this.model.on('change:border_radius', function (model, value) { </span> <span class='diff-add'> this.update_attr('border-radius', this._default_px(value)); }, this);</span> <span class='diff-add'> this.after_displayed(function() {</span> <span class='diff-add'> this.update_visible(this.model, this.model.get("visible"));</span> <span class='diff-add'> this.update_classes([], this.model.get('_dom_classes'));</span> <span class='diff-add'> </span> <span class='diff-add'> this.update_attr('color', this.model.get('color'));</span> <span class='diff-add'> this.update_attr('background', this.model.get('background_color'));</span> <span class='diff-add'> this.update_attr('width', this.model.get('width'));</span> <span class='diff-add'> this.update_attr('height', this.model.get('height'));</span> <span class='diff-add'> this.update_attr('border-color', this.model.get('border_color'));</span> <span class='diff-add'> this.update_attr('border-width', this.model.get('border_width'));</span> <span class='diff-add'> this.update_attr('border-style', this.model.get('border_style'));</span> <span class='diff-add'> this.update_attr('font-style', this.model.get('font_style'));</span> <span class='diff-add'> this.update_attr('font-weight', this.model.get('font_weight'));</span> <span class='diff-add'> this.update_attr('font-size', this._default_px(this.model.get('font_size')));</span> <span class='diff-add'> this.update_attr('font-family', this.model.get('font_family'));</span> <span class='diff-add'> this.update_attr('padding', this.model.get('padding'));</span> <span class='diff-add'> this.update_attr('margin', this._default_px(this.model.get('margin')));</span> <span class='diff-add'> this.update_attr('border-radius', this._default_px(this.model.get('border_radius')));</span> <span class='diff-add'> this.update_css(this.model, this.model.get("_css"));</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> },</span> <span class='diff-add'> _default_px: function(value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Makes browser interpret a numerical string as a pixel value.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (/^\d+\.?(\d+)?$/.test(value.trim())) {</span> <span class='diff-add'> return value.trim() + 'px';</span> <span class='diff-add'> }</span> <span class='diff-add'> return value;</span> <span class='diff-add'> },</span> <span class='diff-add'> update_attr: function(name, value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a css attr of the widget view.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$el.css(name, value);</span> <span class='diff-add'> },</span> <span class='diff-add'> update_visible: function(model, value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update visibility</span> <span class='diff-add'> */</span> <span class='diff-add'> switch(value) {</span> <span class='diff-add'> case null: // python None</span> <span class='diff-add'> this.$el.show().css('visibility', 'hidden'); break;</span> <span class='diff-add'> case false:</span> <span class='diff-add'> this.$el.hide(); break;</span> <span class='diff-add'> case true:</span> <span class='diff-add'> this.$el.show().css('visibility', ''); break;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> update_css: function (model, css) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the css styling of this view.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (css === undefined) {return;}</span> <span class='diff-add'> for (var i = 0; i < css.length; i++) {</span> <span class='diff-add'> // Apply the css traits to all elements that match the selector.</span> <span class='diff-add'> var selector = css[i][0];</span> <span class='diff-add'> var elements = this._get_selector_element(selector);</span> <span class='diff-add'> if (elements.length > 0) {</span> <span class='diff-add'> var trait_key = css[i][1];</span> <span class='diff-add'> var trait_value = css[i][2];</span> <span class='diff-add'> elements.css(trait_key ,trait_value);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> update_classes: function (old_classes, new_classes, $el) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the DOM classes applied to an element, default to this.$el.</span> <span class='diff-add'> */</span> <span class='diff-add'> if ($el===undefined) {</span> <span class='diff-add'> $el = this.$el;</span> <span class='diff-add'> }</span> <span class='diff-add'> _.difference(old_classes, new_classes).map(function(c) {$el.removeClass(c);})</span> <span class='diff-add'> _.difference(new_classes, old_classes).map(function(c) {$el.addClass(c);})</span> <span class='diff-add'> },</span> <span class='diff-add'> update_mapped_classes: function(class_map, trait_name, previous_trait_value, $el) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the DOM classes applied to the widget based on a single</span> <span class='diff-add'> * trait's value.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Given a trait value classes map, this function automatically</span> <span class='diff-add'> * handles applying the appropriate classes to the widget element</span> <span class='diff-add'> * and removing classes that are no longer valid.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Parameters</span> <span class='diff-add'> * ----------</span> <span class='diff-add'> * class_map: dictionary</span> <span class='diff-add'> * Dictionary of trait values to class lists.</span> <span class='diff-add'> * Example:</span> <span class='diff-add'> * {</span> <span class='diff-add'> * success: ['alert', 'alert-success'],</span> <span class='diff-add'> * info: ['alert', 'alert-info'],</span> <span class='diff-add'> * warning: ['alert', 'alert-warning'],</span> <span class='diff-add'> * danger: ['alert', 'alert-danger']</span> <span class='diff-add'> * };</span> <span class='diff-add'> * trait_name: string</span> <span class='diff-add'> * Name of the trait to check the value of.</span> <span class='diff-add'> * previous_trait_value: optional string, default ''</span> <span class='diff-add'> * Last trait value</span> <span class='diff-add'> * $el: optional jQuery element handle, defaults to this.$el</span> <span class='diff-add'> * Element that the classes are applied to.</span> <span class='diff-add'> */</span> <span class='diff-add'> var key = previous_trait_value;</span> <span class='diff-add'> if (key === undefined) {</span> <span class='diff-add'> key = this.model.previous(trait_name);</span> <span class='diff-add'> }</span> <span class='diff-add'> var old_classes = class_map[key] ? class_map[key] : [];</span> <span class='diff-add'> key = this.model.get(trait_name);</span> <span class='diff-add'> var new_classes = class_map[key] ? class_map[key] : [];</span> <span class='diff-add'> this.update_classes(old_classes, new_classes, $el || this.$el);</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> _get_selector_element: function (selector) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Get the elements via the css selector.</span> <span class='diff-add'> */</span> <span class='diff-add'> var elements;</span> <span class='diff-add'> if (!selector) {</span> <span class='diff-add'> elements = this.$el;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> elements = this.$el.find(selector).addBack(selector);</span> <span class='diff-add'> }</span> <span class='diff-add'> return elements;</span> <span class='diff-add'> },</span> <span class='diff-add'> typeset: function(element, text){</span> <span class='diff-add'> utils.typeset.apply(null, arguments);</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> var ViewList = function(create_view, remove_view, context) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * - create_view and remove_view are default functions called when adding or removing views</span> <span class='diff-add'> * - create_view takes a model and returns a view or a promise for a view for that model</span> <span class='diff-add'> * - remove_view takes a view and destroys it (including calling `view.remove()`)</span> <span class='diff-add'> * - each time the update() function is called with a new list, the create and remove</span> <span class='diff-add'> * callbacks will be called in an order so that if you append the views created in the</span> <span class='diff-add'> * create callback and remove the views in the remove callback, you will duplicate </span> <span class='diff-add'> * the order of the list.</span> <span class='diff-add'> * - the remove callback defaults to just removing the view (e.g., pass in null for the second parameter)</span> <span class='diff-add'> * - the context defaults to the created ViewList. If you pass another context, the create and remove</span> <span class='diff-add'> * will be called in that context.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.initialize.apply(this, arguments);</span> <span class='diff-add'> };</span> <span class='diff-add'> _.extend(ViewList.prototype, {</span> <span class='diff-add'> initialize: function(create_view, remove_view, context) {</span> <span class='diff-add'> this._handler_context = context || this;</span> <span class='diff-add'> this._models = [];</span> <span class='diff-add'> this.views = []; // list of promises for views</span> <span class='diff-add'> this._create_view = create_view;</span> <span class='diff-add'> this._remove_view = remove_view || function(view) {view.remove();};</span> <span class='diff-add'> },</span> <span class='diff-add'> update: function(new_models, create_view, remove_view, context) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * the create_view, remove_view, and context arguments override the defaults</span> <span class='diff-add'> * specified when the list is created.</span> <span class='diff-add'> * after this function, the .views attribute is a list of promises for views</span> <span class='diff-add'> * if you want to perform some action on the list of views, do something like</span> <span class='diff-add'> * `Promise.all(myviewlist.views).then(function(views) {...});`</span> <span class='diff-add'> */</span> <span class='diff-add'> var remove = remove_view || this._remove_view;</span> <span class='diff-add'> var create = create_view || this._create_view;</span> <span class='diff-add'> context = context || this._handler_context;</span> <span class='diff-add'> var i = 0;</span> <span class='diff-add'> // first, skip past the beginning of the lists if they are identical</span> <span class='diff-add'> for (; i < new_models.length; i++) {</span> <span class='diff-add'> if (i >= this._models.length || new_models[i] !== this._models[i]) {</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> var first_removed = i;</span> <span class='diff-add'> // Remove the non-matching items from the old list.</span> <span class='diff-add'> var removed = this.views.splice(first_removed, this.views.length-first_removed);</span> <span class='diff-add'> for (var j = 0; j < removed.length; j++) {</span> <span class='diff-add'> removed[j].then(function(view) {</span> <span class='diff-add'> remove.call(context, view)</span> <span class='diff-add'> });</span> <span class='diff-add'> }</span> <span class='diff-add'> // Add the rest of the new list items.</span> <span class='diff-add'> for (; i < new_models.length; i++) {</span> <span class='diff-add'> this.views.push(Promise.resolve(create.call(context, new_models[i])));</span> <span class='diff-add'> }</span> <span class='diff-add'> // make a copy of the input array</span> <span class='diff-add'> this._models = new_models.slice();</span> <span class='diff-add'> },</span> <span class='diff-add'> remove: function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * removes every view in the list; convenience function for `.update([])`</span> <span class='diff-add'> * that should be faster</span> <span class='diff-add'> * returns a promise that resolves after this removal is done</span> <span class='diff-add'> */</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> return Promise.all(this.views).then(function(views) {</span> <span class='diff-add'> for (var i = 0; i < that.views.length; i++) {</span> <span class='diff-add'> that._remove_view.call(that._handler_context, views[i]);</span> <span class='diff-add'> }</span> <span class='diff-add'> that.views = [];</span> <span class='diff-add'> that._models = [];</span> <span class='diff-add'> });</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> var widget = {</span> <span class='diff-add'> 'WidgetModel': WidgetModel,</span> <span class='diff-add'> 'WidgetView': WidgetView,</span> <span class='diff-add'> 'DOMWidgetView': DOMWidgetView,</span> <span class='diff-add'> 'ViewList': ViewList,</span> <span class='diff-add'> };</span> <span class='diff-add'> // For backwards compatability.</span> <span class='diff-add'> $.extend(IPython, widget);</span> <span class='diff-add'> return widget;</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_bool.js b/ipynb/Array-feature-overlap-05_files/widget_bool.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..0234054</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_bool.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> "widgets/js/widget",</span> <span class='diff-add'> "jquery",</span> <span class='diff-add'> "bootstrap",</span> <span class='diff-add'>], function(widget, $){</span> <span class='diff-add'> var CheckboxView = widget.DOMWidgetView.extend({</span> <span class='diff-add'> render : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$el</span> <span class='diff-add'> .addClass('widget-hbox widget-checkbox');</span> <span class='diff-add'> this.$label = $('<div />')</span> <span class='diff-add'> .addClass('widget-label')</span> <span class='diff-add'> .appendTo(this.$el)</span> <span class='diff-add'> .hide();</span> <span class='diff-add'> this.$checkbox = $('<input />')</span> <span class='diff-add'> .attr('type', 'checkbox')</span> <span class='diff-add'> .appendTo(this.$el)</span> <span class='diff-add'> .click($.proxy(this.handle_click, this));</span> <span class='diff-add'> this.update(); // Set defaults.</span> <span class='diff-add'> },</span> <span class='diff-add'> update_attr: function(name, value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a css attr of the widget view.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span> <span class='diff-add'> this.$el.css(name, value);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$checkbox.css(name, value);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> handle_click: function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handles when the checkbox is clicked.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span> <span class='diff-add'> * model to update.</span> <span class='diff-add'> */</span> <span class='diff-add'> var value = this.model.get('value');</span> <span class='diff-add'> this.model.set('value', ! value, {updated_view: this});</span> <span class='diff-add'> this.touch();</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> update : function(options){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$checkbox.prop('checked', this.model.get('value'));</span> <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span> <span class='diff-add'> var disabled = this.model.get('disabled');</span> <span class='diff-add'> this.$checkbox.prop('disabled', disabled);</span> <span class='diff-add'> var description = this.model.get('description');</span> <span class='diff-add'> if (description.trim().length === 0) {</span> <span class='diff-add'> this.$label.hide();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.typeset(this.$label, description);</span> <span class='diff-add'> this.$label.show();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return CheckboxView.__super__.update.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> });</span> <span class='diff-add'> var ToggleButtonView = widget.DOMWidgetView.extend({</span> <span class='diff-add'> render : function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.setElement($('<button />')</span> <span class='diff-add'> .addClass('btn btn-default')</span> <span class='diff-add'> .attr('type', 'button')</span> <span class='diff-add'> .on('click', function (e) {</span> <span class='diff-add'> e.preventDefault();</span> <span class='diff-add'> that.handle_click();</span> <span class='diff-add'> }));</span> <span class='diff-add'> this.$el.attr("data-toggle", "tooltip");</span> <span class='diff-add'> this.model.on('change:button_style', function(model, value) {</span> <span class='diff-add'> this.update_button_style();</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.update_button_style('');</span> <span class='diff-add'> this.update(); // Set defaults.</span> <span class='diff-add'> },</span> <span class='diff-add'> update_button_style: function(previous_trait_value) {</span> <span class='diff-add'> var class_map = {</span> <span class='diff-add'> primary: ['btn-primary'],</span> <span class='diff-add'> success: ['btn-success'],</span> <span class='diff-add'> info: ['btn-info'],</span> <span class='diff-add'> warning: ['btn-warning'],</span> <span class='diff-add'> danger: ['btn-danger']</span> <span class='diff-add'> };</span> <span class='diff-add'> this.update_mapped_classes(class_map, 'button_style', previous_trait_value);</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> update : function(options){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (this.model.get('value')) {</span> <span class='diff-add'> this.$el.addClass('active');</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$el.removeClass('active');</span> <span class='diff-add'> }</span> <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span> <span class='diff-add'> var disabled = this.model.get('disabled');</span> <span class='diff-add'> this.$el.prop('disabled', disabled);</span> <span class='diff-add'> var description = this.model.get('description');</span> <span class='diff-add'> this.$el.attr("title", this.model.get("tooltip"));</span> <span class='diff-add'> if (description.trim().length === 0) {</span> <span class='diff-add'> this.$el.html(" "); // Preserve button height</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$el.text(description);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return ToggleButtonView.__super__.update.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> handle_click: function(e) { </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handles and validates user input.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span> <span class='diff-add'> * model to update.</span> <span class='diff-add'> */</span> <span class='diff-add'> var value = this.model.get('value');</span> <span class='diff-add'> this.model.set('value', ! value, {updated_view: this});</span> <span class='diff-add'> this.touch();</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> return {</span> <span class='diff-add'> 'CheckboxView': CheckboxView,</span> <span class='diff-add'> 'ToggleButtonView': ToggleButtonView,</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_box.js b/ipynb/Array-feature-overlap-05_files/widget_box.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..247eb5d</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_box.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> "widgets/js/widget",</span> <span class='diff-add'> "jqueryui",</span> <span class='diff-add'> "base/js/utils",</span> <span class='diff-add'> "bootstrap",</span> <span class='diff-add'>], function(widget, $, utils){</span> <span class='diff-add'> "use strict";</span> <span class='diff-add'> var BoxView = widget.DOMWidgetView.extend({</span> <span class='diff-add'> initialize: function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Public constructor</span> <span class='diff-add'> */</span> <span class='diff-add'> BoxView.__super__.initialize.apply(this, arguments);</span> <span class='diff-add'> this.children_views = new widget.ViewList(this.add_child_model, null, this);</span> <span class='diff-add'> this.listenTo(this.model, 'change:children', function(model, value) {</span> <span class='diff-add'> this.children_views.update(value);</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.listenTo(this.model, 'change:overflow_x', function(model, value) {</span> <span class='diff-add'> this.update_overflow_x();</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.listenTo(this.model, 'change:overflow_y', function(model, value) {</span> <span class='diff-add'> this.update_overflow_y();</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.listenTo(this.model, 'change:box_style', function(model, value) {</span> <span class='diff-add'> this.update_box_style();</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> },</span> <span class='diff-add'> update_attr: function(name, value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a css attr of the widget view.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$box.css(name, value);</span> <span class='diff-add'> },</span> <span class='diff-add'> render: function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$box = this.$el;</span> <span class='diff-add'> this.$box.addClass('widget-box');</span> <span class='diff-add'> this.children_views.update(this.model.get('children'));</span> <span class='diff-add'> this.update_overflow_x();</span> <span class='diff-add'> this.update_overflow_y();</span> <span class='diff-add'> this.update_box_style('');</span> <span class='diff-add'> },</span> <span class='diff-add'> update_overflow_x: function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when the x-axis overflow setting is changed.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$box.css('overflow-x', this.model.get('overflow_x'));</span> <span class='diff-add'> },</span> <span class='diff-add'> update_overflow_y: function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when the y-axis overflow setting is changed.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$box.css('overflow-y', this.model.get('overflow_y'));</span> <span class='diff-add'> },</span> <span class='diff-add'> update_box_style: function(previous_trait_value) {</span> <span class='diff-add'> var class_map = {</span> <span class='diff-add'> success: ['alert', 'alert-success'],</span> <span class='diff-add'> info: ['alert', 'alert-info'],</span> <span class='diff-add'> warning: ['alert', 'alert-warning'],</span> <span class='diff-add'> danger: ['alert', 'alert-danger']</span> <span class='diff-add'> };</span> <span class='diff-add'> this.update_mapped_classes(class_map, 'box_style', previous_trait_value, this.$box);</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> add_child_model: function(model) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when a model is added to the children list.</span> <span class='diff-add'> */</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var dummy = $('<div/>');</span> <span class='diff-add'> that.$box.append(dummy);</span> <span class='diff-add'> return this.create_child_view(model).then(function(view) {</span> <span class='diff-add'> dummy.replaceWith(view.el);</span> <span class='diff-add'> // Trigger the displayed event of the child view.</span> <span class='diff-add'> that.after_displayed(function() {</span> <span class='diff-add'> view.trigger('displayed');</span> <span class='diff-add'> });</span> <span class='diff-add'> return view;</span> <span class='diff-add'> }).catch(utils.reject("Couldn't add child view to box", true));</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> remove: function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * We remove this widget before removing the children as an optimization</span> <span class='diff-add'> * we want to remove the entire container from the DOM first before</span> <span class='diff-add'> * removing each individual child separately.</span> <span class='diff-add'> */</span> <span class='diff-add'> BoxView.__super__.remove.apply(this, arguments);</span> <span class='diff-add'> this.children_views.remove();</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> var FlexBoxView = BoxView.extend({</span> <span class='diff-add'> render: function(){</span> <span class='diff-add'> FlexBoxView.__super__.render.apply(this);</span> <span class='diff-add'> this.listenTo(this.model, 'change:orientation', this.update_orientation, this);</span> <span class='diff-add'> this.listenTo(this.model, 'change:flex', this._flex_changed, this);</span> <span class='diff-add'> this.listenTo(this.model, 'change:pack', this._pack_changed, this);</span> <span class='diff-add'> this.listenTo(this.model, 'change:align', this._align_changed, this);</span> <span class='diff-add'> this._flex_changed();</span> <span class='diff-add'> this._pack_changed();</span> <span class='diff-add'> this._align_changed();</span> <span class='diff-add'> this.update_orientation();</span> <span class='diff-add'> },</span> <span class='diff-add'> update_orientation: function(){</span> <span class='diff-add'> var orientation = this.model.get("orientation");</span> <span class='diff-add'> if (orientation == "vertical") {</span> <span class='diff-add'> this.$box.removeClass("hbox").addClass("vbox");</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$box.removeClass("vbox").addClass("hbox");</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> _flex_changed: function(){</span> <span class='diff-add'> if (this.model.previous('flex')) {</span> <span class='diff-add'> this.$box.removeClass('box-flex' + this.model.previous('flex'));</span> <span class='diff-add'> }</span> <span class='diff-add'> this.$box.addClass('box-flex' + this.model.get('flex'));</span> <span class='diff-add'> },</span> <span class='diff-add'> _pack_changed: function(){</span> <span class='diff-add'> if (this.model.previous('pack')) {</span> <span class='diff-add'> this.$box.removeClass(this.model.previous('pack'));</span> <span class='diff-add'> }</span> <span class='diff-add'> this.$box.addClass(this.model.get('pack'));</span> <span class='diff-add'> },</span> <span class='diff-add'> _align_changed: function(){</span> <span class='diff-add'> if (this.model.previous('align')) {</span> <span class='diff-add'> this.$box.removeClass('align-' + this.model.previous('align'));</span> <span class='diff-add'> }</span> <span class='diff-add'> this.$box.addClass('align-' + this.model.get('align'));</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> return {</span> <span class='diff-add'> 'BoxView': BoxView,</span> <span class='diff-add'> 'FlexBoxView': FlexBoxView,</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_button.js b/ipynb/Array-feature-overlap-05_files/widget_button.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..c476581</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_button.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> "widgets/js/widget",</span> <span class='diff-add'> "jquery",</span> <span class='diff-add'> "bootstrap",</span> <span class='diff-add'>], function(widget, $){</span> <span class='diff-add'> var ButtonView = widget.DOMWidgetView.extend({</span> <span class='diff-add'> render : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.setElement($("<button />")</span> <span class='diff-add'> .addClass('btn btn-default'));</span> <span class='diff-add'> this.$el.attr("data-toggle", "tooltip");</span> <span class='diff-add'> this.model.on('change:button_style', function(model, value) {</span> <span class='diff-add'> this.update_button_style();</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.update_button_style('');</span> <span class='diff-add'> this.update(); // Set defaults.</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> update : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> var description = this.model.get('description');</span> <span class='diff-add'> this.$el.attr("title", this.model.get("tooltip"));</span> <span class='diff-add'> if (description.length === 0) {</span> <span class='diff-add'> this.$el.html(" "); // Preserve button height</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$el.text(description);</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> if (this.model.get('disabled')) {</span> <span class='diff-add'> this.$el.attr('disabled','disabled');</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$el.removeAttr('disabled');</span> <span class='diff-add'> }</span> <span class='diff-add'> return ButtonView.__super__.update.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> update_button_style: function(previous_trait_value) {</span> <span class='diff-add'> var class_map = {</span> <span class='diff-add'> primary: ['btn-primary'],</span> <span class='diff-add'> success: ['btn-success'],</span> <span class='diff-add'> info: ['btn-info'],</span> <span class='diff-add'> warning: ['btn-warning'],</span> <span class='diff-add'> danger: ['btn-danger']</span> <span class='diff-add'> };</span> <span class='diff-add'> this.update_mapped_classes(class_map, 'button_style', previous_trait_value);</span> <span class='diff-add'> },</span> <span class='diff-add'> events: {</span> <span class='diff-add'> // Dictionary of events and their handlers.</span> <span class='diff-add'> 'click': '_handle_click',</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> _handle_click: function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handles when the button is clicked.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.send({event: 'click'});</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> return {</span> <span class='diff-add'> 'ButtonView': ButtonView,</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_float.js b/ipynb/Array-feature-overlap-05_files/widget_float.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..1ab98eb</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_float.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> "widgets/js/widget",</span> <span class='diff-add'> "widgets/js/widget_int",</span> <span class='diff-add'>], function(widget, int_widgets){</span> <span class='diff-add'> var IntSliderView = int_widgets.IntSliderView;</span> <span class='diff-add'> var IntTextView = int_widgets.IntTextView;</span> <span class='diff-add'> var FloatSliderView = IntSliderView.extend({</span> <span class='diff-add'> _parse_value: parseFloat,</span> <span class='diff-add'> // matches: whitespace?, float, whitespace?, [-:], whitespace?, float</span> <span class='diff-add'> _range_regex: /^\s*([+-]?(?:\d*\.?\d+|\d+\.)(?:[eE][+-]?\d+)?)\s*[-:]\s*([+-]?(?:\d*\.?\d+|\d+\.)(?:[eE][+-]?\d+)?)/,</span> <span class='diff-add'> _validate_slide_value: function(x) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Validate the value of the slider before sending it to the back-end</span> <span class='diff-add'> * and applying it to the other views on the page.</span> <span class='diff-add'> */</span> <span class='diff-add'> return x;</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> var FloatTextView = IntTextView.extend({</span> <span class='diff-add'> _parse_value: parseFloat</span> <span class='diff-add'> });</span> <span class='diff-add'> return {</span> <span class='diff-add'> 'FloatSliderView': FloatSliderView,</span> <span class='diff-add'> 'FloatTextView': FloatTextView,</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_image.js b/ipynb/Array-feature-overlap-05_files/widget_image.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..1c926e6</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_image.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> "widgets/js/widget",</span> <span class='diff-add'> "jquery",</span> <span class='diff-add'>], function(widget, $){</span> <span class='diff-add'> </span> <span class='diff-add'> var ImageView = widget.DOMWidgetView.extend({ </span> <span class='diff-add'> render : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.setElement($("<img />"));</span> <span class='diff-add'> this.update(); // Set defaults.</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> update : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> var image_src = 'data:image/' + this.model.get('format') + ';base64,' + this.model.get('_b64value');</span> <span class='diff-add'> this.$el.attr('src', image_src);</span> <span class='diff-add'> </span> <span class='diff-add'> var width = this.model.get('width');</span> <span class='diff-add'> if (width !== undefined && width.length > 0) {</span> <span class='diff-add'> this.$el.attr('width', width);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$el.removeAttr('width');</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> var height = this.model.get('height');</span> <span class='diff-add'> if (height !== undefined && height.length > 0) {</span> <span class='diff-add'> this.$el.attr('height', height);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$el.removeAttr('height');</span> <span class='diff-add'> }</span> <span class='diff-add'> return ImageView.__super__.update.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> return {</span> <span class='diff-add'> 'ImageView': ImageView,</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_int.js b/ipynb/Array-feature-overlap-05_files/widget_int.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..55af301</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_int.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> "widgets/js/widget",</span> <span class='diff-add'> "jqueryui",</span> <span class='diff-add'> "base/js/keyboard",</span> <span class='diff-add'> "bootstrap"</span> <span class='diff-add'>], function(widget, $, keyboard){</span> <span class='diff-add'> </span> <span class='diff-add'> var IntSliderView = widget.DOMWidgetView.extend({</span> <span class='diff-add'> render : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$el</span> <span class='diff-add'> .addClass('widget-hbox widget-slider');</span> <span class='diff-add'> this.$label = $('<div />')</span> <span class='diff-add'> .appendTo(this.$el)</span> <span class='diff-add'> .addClass('widget-label')</span> <span class='diff-add'> .hide();</span> <span class='diff-add'> </span> <span class='diff-add'> this.$slider = $('<div />')</span> <span class='diff-add'> .slider({})</span> <span class='diff-add'> .addClass('slider');</span> <span class='diff-add'> // Put the slider in a container </span> <span class='diff-add'> this.$slider_container = $('<div />')</span> <span class='diff-add'> .addClass('widget-hslider')</span> <span class='diff-add'> .append(this.$slider);</span> <span class='diff-add'> this.$el.append(this.$slider_container);</span> <span class='diff-add'> </span> <span class='diff-add'> this.$readout = $('<div/>')</span> <span class='diff-add'> .appendTo(this.$el)</span> <span class='diff-add'> .addClass('widget-readout')</span> <span class='diff-add'> .attr('contentEditable', true)</span> <span class='diff-add'> .hide();</span> <span class='diff-add'> this.model.on('change:slider_color', function(sender, value) {</span> <span class='diff-add'> this.$slider.find('a').css('background', value);</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.$slider.find('a').css('background', this.model.get('slider_color'));</span> <span class='diff-add'> </span> <span class='diff-add'> // Set defaults.</span> <span class='diff-add'> this.update();</span> <span class='diff-add'> },</span> <span class='diff-add'> update_attr: function(name, value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a css attr of the widget view.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (name == 'color') {</span> <span class='diff-add'> this.$readout.css(name, value);</span> <span class='diff-add'> } else if (name.substring(0, 4) == 'font') {</span> <span class='diff-add'> this.$readout.css(name, value);</span> <span class='diff-add'> } else if (name.substring(0, 6) == 'border') {</span> <span class='diff-add'> this.$slider.find('a').css(name, value);</span> <span class='diff-add'> this.$slider_container.css(name, value);</span> <span class='diff-add'> } else if (name == 'width' || name == 'height' || name == 'background') {</span> <span class='diff-add'> this.$slider_container.css(name, value);</span> <span class='diff-add'> } else if (name == 'padding' || name == 'margin') {</span> <span class='diff-add'> this.$el.css(name, value);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$slider.css(name, value);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> update : function(options){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span> <span class='diff-add'> // JQuery slider option keys. These keys happen to have a</span> <span class='diff-add'> // one-to-one mapping with the corrosponding keys of the model.</span> <span class='diff-add'> var jquery_slider_keys = ['step', 'disabled'];</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> that.$slider.slider({});</span> <span class='diff-add'> _.each(jquery_slider_keys, function(key, i) {</span> <span class='diff-add'> var model_value = that.model.get(key);</span> <span class='diff-add'> if (model_value !== undefined) {</span> <span class='diff-add'> that.$slider.slider("option", key, model_value);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> var max = this.model.get('max');</span> <span class='diff-add'> var min = this.model.get('min');</span> <span class='diff-add'> if (min <= max) {</span> <span class='diff-add'> if (max !== undefined) this.$slider.slider('option', 'max', max);</span> <span class='diff-add'> if (min !== undefined) this.$slider.slider('option', 'min', min);</span> <span class='diff-add'> }</span> <span class='diff-add'> var range_value = this.model.get("_range");</span> <span class='diff-add'> if (range_value !== undefined) {</span> <span class='diff-add'> this.$slider.slider("option", "range", range_value);</span> <span class='diff-add'> }</span> <span class='diff-add'> // WORKAROUND FOR JQUERY SLIDER BUG.</span> <span class='diff-add'> // The horizontal position of the slider handle</span> <span class='diff-add'> // depends on the value of the slider at the time</span> <span class='diff-add'> // of orientation change. Before applying the new</span> <span class='diff-add'> // workaround, we set the value to the minimum to</span> <span class='diff-add'> // make sure that the horizontal placement of the</span> <span class='diff-add'> // handle in the vertical slider is always </span> <span class='diff-add'> // consistent.</span> <span class='diff-add'> var orientation = this.model.get('orientation');</span> <span class='diff-add'> var min = this.model.get('min');</span> <span class='diff-add'> var max = this.model.get('max');</span> <span class='diff-add'> if (this.model.get('_range')) {</span> <span class='diff-add'> this.$slider.slider('option', 'values', [min, min]);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$slider.slider('option', 'value', min);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.$slider.slider('option', 'orientation', orientation);</span> <span class='diff-add'> var value = this.model.get('value');</span> <span class='diff-add'> if (this.model.get('_range')) {</span> <span class='diff-add'> // values for the range case are validated python-side in</span> <span class='diff-add'> // _Bounded{Int,Float}RangeWidget._validate</span> <span class='diff-add'> this.$slider.slider('option', 'values', value);</span> <span class='diff-add'> this.$readout.text(value.join("-"));</span> <span class='diff-add'> } else {</span> <span class='diff-add'> if(value > max) { </span> <span class='diff-add'> value = max; </span> <span class='diff-add'> }</span> <span class='diff-add'> else if(value < min){ </span> <span class='diff-add'> value = min; </span> <span class='diff-add'> }</span> <span class='diff-add'> this.$slider.slider('option', 'value', value);</span> <span class='diff-add'> this.$readout.text(value);</span> <span class='diff-add'> }</span> <span class='diff-add'> if(this.model.get('value')!=value) {</span> <span class='diff-add'> this.model.set('value', value, {updated_view: this});</span> <span class='diff-add'> this.touch();</span> <span class='diff-add'> }</span> <span class='diff-add'> // Use the right CSS classes for vertical & horizontal sliders</span> <span class='diff-add'> if (orientation=='vertical') {</span> <span class='diff-add'> this.$slider_container</span> <span class='diff-add'> .removeClass('widget-hslider')</span> <span class='diff-add'> .addClass('widget-vslider');</span> <span class='diff-add'> this.$el</span> <span class='diff-add'> .removeClass('widget-hbox')</span> <span class='diff-add'> .addClass('widget-vbox');</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$slider_container</span> <span class='diff-add'> .removeClass('widget-vslider')</span> <span class='diff-add'> .addClass('widget-hslider');</span> <span class='diff-add'> this.$el</span> <span class='diff-add'> .removeClass('widget-vbox')</span> <span class='diff-add'> .addClass('widget-hbox');</span> <span class='diff-add'> }</span> <span class='diff-add'> var description = this.model.get('description');</span> <span class='diff-add'> if (description.length === 0) {</span> <span class='diff-add'> this.$label.hide();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.typeset(this.$label, description);</span> <span class='diff-add'> this.$label.show();</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> var readout = this.model.get('readout');</span> <span class='diff-add'> if (readout) {</span> <span class='diff-add'> this.$readout.show();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$readout.hide();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return IntSliderView.__super__.update.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> events: {</span> <span class='diff-add'> // Dictionary of events and their handlers.</span> <span class='diff-add'> "slide" : "handleSliderChange",</span> <span class='diff-add'> "blur [contentEditable=true]": "handleTextChange",</span> <span class='diff-add'> "keydown [contentEditable=true]": "handleKeyDown"</span> <span class='diff-add'> }, </span> <span class='diff-add'> handleKeyDown: function(e) {</span> <span class='diff-add'> if (e.keyCode == keyboard.keycodes.enter) {</span> <span class='diff-add'> e.preventDefault();</span> <span class='diff-add'> this.handleTextChange();</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> handleTextChange: function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * this handles the entry of text into the contentEditable label</span> <span class='diff-add'> * first, the value is checked if it contains a parseable number</span> <span class='diff-add'> * (or pair of numbers, for the _range case)</span> <span class='diff-add'> * then it is clamped within the min-max range of the slider</span> <span class='diff-add'> * finally, the model is updated if the value is to be changed</span> <span class='diff-add'> *</span> <span class='diff-add'> * if any of these conditions are not met, the text is reset</span> <span class='diff-add'> *</span> <span class='diff-add'> * the step size is not enforced</span> <span class='diff-add'> */</span> <span class='diff-add'> var text = this.$readout.text();</span> <span class='diff-add'> var vmin = this.model.get('min');</span> <span class='diff-add'> var vmax = this.model.get('max');</span> <span class='diff-add'> if (this.model.get("_range")) {</span> <span class='diff-add'> // range case</span> <span class='diff-add'> // ranges can be expressed either "val-val" or "val:val" (+spaces)</span> <span class='diff-add'> var match = this._range_regex.exec(text);</span> <span class='diff-add'> if (match) {</span> <span class='diff-add'> var values = [this._parse_value(match[1]),</span> <span class='diff-add'> this._parse_value(match[2])];</span> <span class='diff-add'> // reject input where NaN or lower > upper</span> <span class='diff-add'> if (isNaN(values[0]) ||</span> <span class='diff-add'> isNaN(values[1]) ||</span> <span class='diff-add'> (values[0] > values[1])) {</span> <span class='diff-add'> this.$readout.text(this.model.get('value').join('-'));</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // clamp to range</span> <span class='diff-add'> values = [Math.max(Math.min(values[0], vmax), vmin),</span> <span class='diff-add'> Math.max(Math.min(values[1], vmax), vmin)];</span> <span class='diff-add'> if ((values[0] != this.model.get('value')[0]) ||</span> <span class='diff-add'> (values[1] != this.model.get('value')[1])) {</span> <span class='diff-add'> this.$readout.text(values.join('-'));</span> <span class='diff-add'> this.model.set('value', values, {updated_view: this});</span> <span class='diff-add'> this.touch();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$readout.text(this.model.get('value').join('-'));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$readout.text(this.model.get('value').join('-'));</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> // single value case</span> <span class='diff-add'> var value = this._parse_value(text);</span> <span class='diff-add'> if (isNaN(value)) {</span> <span class='diff-add'> this.$readout.text(this.model.get('value'));</span> <span class='diff-add'> } else {</span> <span class='diff-add'> value = Math.max(Math.min(value, vmax), vmin);</span> <span class='diff-add'> if (value != this.model.get('value')) {</span> <span class='diff-add'> this.$readout.text(value);</span> <span class='diff-add'> this.model.set('value', value, {updated_view: this});</span> <span class='diff-add'> this.touch();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$readout.text(this.model.get('value'));</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> _parse_value: parseInt,</span> <span class='diff-add'> _range_regex: /^\s*([+-]?\d+)\s*[-:]\s*([+-]?\d+)/,</span> <span class='diff-add'> handleSliderChange: function(e, ui) { </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when the slider value is changed.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span> <span class='diff-add'> * model to update.</span> <span class='diff-add'> */</span> <span class='diff-add'> var actual_value;</span> <span class='diff-add'> if (this.model.get("_range")) {</span> <span class='diff-add'> actual_value = ui.values.map(this._validate_slide_value);</span> <span class='diff-add'> this.$readout.text(actual_value.join("-"));</span> <span class='diff-add'> } else {</span> <span class='diff-add'> actual_value = this._validate_slide_value(ui.value);</span> <span class='diff-add'> this.$readout.text(actual_value);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.model.set('value', actual_value, {updated_view: this});</span> <span class='diff-add'> this.touch();</span> <span class='diff-add'> },</span> <span class='diff-add'> _validate_slide_value: function(x) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Validate the value of the slider before sending it to the back-end</span> <span class='diff-add'> * and applying it to the other views on the page.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Double bit-wise not truncates the decimel (int cast).</span> <span class='diff-add'> */</span> <span class='diff-add'> return ~~x;</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> var IntTextView = widget.DOMWidgetView.extend({ </span> <span class='diff-add'> render : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$el</span> <span class='diff-add'> .addClass('widget-hbox widget-numeric-text');</span> <span class='diff-add'> this.$label = $('<div />')</span> <span class='diff-add'> .appendTo(this.$el)</span> <span class='diff-add'> .addClass('widget-label')</span> <span class='diff-add'> .hide();</span> <span class='diff-add'> this.$textbox = $('<input type="text" />')</span> <span class='diff-add'> .addClass('form-control')</span> <span class='diff-add'> .addClass('widget-numeric-text')</span> <span class='diff-add'> .appendTo(this.$el);</span> <span class='diff-add'> this.update(); // Set defaults.</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> update : function(options){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span> <span class='diff-add'> var value = this.model.get('value');</span> <span class='diff-add'> if (this._parse_value(this.$textbox.val()) != value) {</span> <span class='diff-add'> this.$textbox.val(value);</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> if (this.model.get('disabled')) {</span> <span class='diff-add'> this.$textbox.attr('disabled','disabled');</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$textbox.removeAttr('disabled');</span> <span class='diff-add'> }</span> <span class='diff-add'> var description = this.model.get('description');</span> <span class='diff-add'> if (description.length === 0) {</span> <span class='diff-add'> this.$label.hide();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.typeset(this.$label, description);</span> <span class='diff-add'> this.$label.show();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return IntTextView.__super__.update.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> update_attr: function(name, value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a css attr of the widget view.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span> <span class='diff-add'> this.$el.css(name, value);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$textbox.css(name, value);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> events: {</span> <span class='diff-add'> // Dictionary of events and their handlers.</span> <span class='diff-add'> "keyup input" : "handleChanging",</span> <span class='diff-add'> "paste input" : "handleChanging",</span> <span class='diff-add'> "cut input" : "handleChanging",</span> <span class='diff-add'> // Fires only when control is validated or looses focus.</span> <span class='diff-add'> "change input" : "handleChanged"</span> <span class='diff-add'> }, </span> <span class='diff-add'> </span> <span class='diff-add'> handleChanging: function(e) { </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handles and validates user input.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Try to parse value as a int.</span> <span class='diff-add'> */</span> <span class='diff-add'> var numericalValue = 0;</span> <span class='diff-add'> var trimmed = e.target.value.trim();</span> <span class='diff-add'> if (trimmed === '') {</span> <span class='diff-add'> return;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> if (!(['-', '-.', '.', '+.', '+'].indexOf(trimmed) >= 0)) {</span> <span class='diff-add'> numericalValue = this._parse_value(e.target.value); </span> <span class='diff-add'> } </span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> // If parse failed, reset value to value stored in model.</span> <span class='diff-add'> if (isNaN(numericalValue)) {</span> <span class='diff-add'> e.target.value = this.model.get('value');</span> <span class='diff-add'> } else if (!isNaN(numericalValue)) {</span> <span class='diff-add'> if (this.model.get('max') !== undefined) {</span> <span class='diff-add'> numericalValue = Math.min(this.model.get('max'), numericalValue);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (this.model.get('min') !== undefined) {</span> <span class='diff-add'> numericalValue = Math.max(this.model.get('min'), numericalValue);</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> // Apply the value if it has changed.</span> <span class='diff-add'> if (numericalValue != this.model.get('value')) {</span> <span class='diff-add'> </span> <span class='diff-add'> // Calling model.set will trigger all of the other views of the </span> <span class='diff-add'> // model to update.</span> <span class='diff-add'> this.model.set('value', numericalValue, {updated_view: this});</span> <span class='diff-add'> this.touch();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> handleChanged: function(e) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Applies validated input.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (e.target.value.trim() === '' || e.target.value !== this.model.get('value')) {</span> <span class='diff-add'> e.target.value = this.model.get('value');</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> _parse_value: parseInt</span> <span class='diff-add'> });</span> <span class='diff-add'> var ProgressView = widget.DOMWidgetView.extend({</span> <span class='diff-add'> render : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$el</span> <span class='diff-add'> .addClass('widget-hbox widget-progress');</span> <span class='diff-add'> this.$label = $('<div />')</span> <span class='diff-add'> .appendTo(this.$el)</span> <span class='diff-add'> .addClass('widget-label')</span> <span class='diff-add'> .hide();</span> <span class='diff-add'> this.$progress = $('<div />')</span> <span class='diff-add'> .addClass('progress')</span> <span class='diff-add'> .addClass('widget-progress')</span> <span class='diff-add'> .appendTo(this.$el);</span> <span class='diff-add'> this.$bar = $('<div />')</span> <span class='diff-add'> .addClass('progress-bar')</span> <span class='diff-add'> .css('width', '50%')</span> <span class='diff-add'> .appendTo(this.$progress);</span> <span class='diff-add'> this.update(); // Set defaults.</span> <span class='diff-add'> this.model.on('change:bar_style', function(model, value) {</span> <span class='diff-add'> this.update_bar_style();</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.update_bar_style('');</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> update : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> var value = this.model.get('value');</span> <span class='diff-add'> var max = this.model.get('max');</span> <span class='diff-add'> var min = this.model.get('min');</span> <span class='diff-add'> var percent = 100.0 * (value - min) / (max - min);</span> <span class='diff-add'> this.$bar.css('width', percent + '%');</span> <span class='diff-add'> </span> <span class='diff-add'> var description = this.model.get('description');</span> <span class='diff-add'> if (description.length === 0) {</span> <span class='diff-add'> this.$label.hide();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.typeset(this.$label, description);</span> <span class='diff-add'> this.$label.show();</span> <span class='diff-add'> }</span> <span class='diff-add'> return ProgressView.__super__.update.apply(this);</span> <span class='diff-add'> }, </span> <span class='diff-add'> update_bar_style: function(previous_trait_value) {</span> <span class='diff-add'> var class_map = {</span> <span class='diff-add'> success: ['progress-bar-success'],</span> <span class='diff-add'> info: ['progress-bar-info'],</span> <span class='diff-add'> warning: ['progress-bar-warning'],</span> <span class='diff-add'> danger: ['progress-bar-danger']</span> <span class='diff-add'> };</span> <span class='diff-add'> this.update_mapped_classes(class_map, 'bar_style', previous_trait_value, this.$bar);</span> <span class='diff-add'> },</span> <span class='diff-add'> update_attr: function(name, value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a css attr of the widget view.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (name.substring(0, 6) == 'border' || name == 'width' || </span> <span class='diff-add'> name == 'height' || name == 'background' || name == 'margin' || </span> <span class='diff-add'> name == 'padding') {</span> <span class='diff-add'> </span> <span class='diff-add'> this.$progress.css(name, value);</span> <span class='diff-add'> } else if (name == 'color') { </span> <span class='diff-add'> this.$bar.css('background', value);</span> <span class='diff-add'> } else if (name == 'padding' || name == 'margin') {</span> <span class='diff-add'> this.$el.css(name, value);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$bar.css(name, value);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> return {</span> <span class='diff-add'> 'IntSliderView': IntSliderView, </span> <span class='diff-add'> 'IntTextView': IntTextView,</span> <span class='diff-add'> 'ProgressView': ProgressView,</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_link.js b/ipynb/Array-feature-overlap-05_files/widget_link.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..ba76dbd</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_link.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> "widgets/js/widget",</span> <span class='diff-add'> "jquery",</span> <span class='diff-add'>], function(widget, $){</span> <span class='diff-add'> var LinkModel = widget.WidgetModel.extend({</span> <span class='diff-add'> initialize: function() {</span> <span class='diff-add'> this.on("change:widgets", function(model, value, options) {</span> <span class='diff-add'> this.update_bindings(model.previous("widgets") || [], value);</span> <span class='diff-add'> this.update_value(this.get("widgets")[0]);</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.once("destroy", function(model, collection, options) {</span> <span class='diff-add'> this.update_bindings(this.get("widgets"), []);</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> },</span> <span class='diff-add'> update_bindings: function(oldlist, newlist) {</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> _.each(oldlist, function(elt) {elt[0].off("change:" + elt[1], null, that);});</span> <span class='diff-add'> _.each(newlist, function(elt) {elt[0].on("change:" + elt[1],</span> <span class='diff-add'> function(model, value, options) {</span> <span class='diff-add'> that.update_value(elt);</span> <span class='diff-add'> }, that);</span> <span class='diff-add'> // TODO: register for any destruction handlers</span> <span class='diff-add'> // to take an item out of the list</span> <span class='diff-add'> });</span> <span class='diff-add'> },</span> <span class='diff-add'> update_value: function(elt) {</span> <span class='diff-add'> if (this.updating) {return;}</span> <span class='diff-add'> var model = elt[0];</span> <span class='diff-add'> var attr = elt[1];</span> <span class='diff-add'> var new_value = model.get(attr);</span> <span class='diff-add'> this.updating = true;</span> <span class='diff-add'> _.each(_.without(this.get("widgets"), elt),</span> <span class='diff-add'> function(element, index, list) {</span> <span class='diff-add'> if (element[0]) {</span> <span class='diff-add'> element[0].set(element[1], new_value);</span> <span class='diff-add'> element[0].save_changes();</span> <span class='diff-add'> }</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.updating = false;</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> var DirectionalLinkModel = widget.WidgetModel.extend({</span> <span class='diff-add'> initialize: function() {</span> <span class='diff-add'> this.on("change", this.update_bindings, this);</span> <span class='diff-add'> this.once("destroy", function() {</span> <span class='diff-add'> if (this.source) {</span> <span class='diff-add'> this.source[0].off("change:" + this.source[1], null, this);</span> <span class='diff-add'> }</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> },</span> <span class='diff-add'> update_bindings: function() {</span> <span class='diff-add'> if (this.source) {</span> <span class='diff-add'> this.source[0].off("change:" + this.source[1], null, this);</span> <span class='diff-add'> }</span> <span class='diff-add'> this.source = this.get("source");</span> <span class='diff-add'> if (this.source) {</span> <span class='diff-add'> this.source[0].on("change:" + this.source[1], function() { this.update_value(this.source); }, this);</span> <span class='diff-add'> this.update_value(this.source);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> update_value: function(elt) {</span> <span class='diff-add'> if (this.updating) {return;}</span> <span class='diff-add'> var model = elt[0];</span> <span class='diff-add'> var attr = elt[1];</span> <span class='diff-add'> var new_value = model.get(attr);</span> <span class='diff-add'> this.updating = true;</span> <span class='diff-add'> _.each(this.get("targets"),</span> <span class='diff-add'> function(element, index, list) {</span> <span class='diff-add'> if (element[0]) {</span> <span class='diff-add'> element[0].set(element[1], new_value);</span> <span class='diff-add'> element[0].save_changes();</span> <span class='diff-add'> }</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.updating = false;</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> return {</span> <span class='diff-add'> "LinkModel": LinkModel,</span> <span class='diff-add'> "DirectionalLinkModel": DirectionalLinkModel,</span> <span class='diff-add'> }</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_output.js b/ipynb/Array-feature-overlap-05_files/widget_output.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..a9fa4c3</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_output.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> "widgets/js/widget",</span> <span class='diff-add'> "jquery",</span> <span class='diff-add'> 'notebook/js/outputarea',</span> <span class='diff-add'>], function(widget, $, outputarea) {</span> <span class='diff-add'> 'use strict';</span> <span class='diff-add'> var OutputView = widget.DOMWidgetView.extend({</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Public constructor</span> <span class='diff-add'> */</span> <span class='diff-add'> initialize: function (parameters) {</span> <span class='diff-add'> OutputView.__super__.initialize.apply(this, [parameters]);</span> <span class='diff-add'> this.model.on('msg:custom', this._handle_route_msg, this);</span> <span class='diff-add'> },</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> render: function(){</span> <span class='diff-add'> this.output_area = new outputarea.OutputArea({</span> <span class='diff-add'> selector: this.$el, </span> <span class='diff-add'> prompt_area: false, </span> <span class='diff-add'> events: this.model.widget_manager.notebook.events, </span> <span class='diff-add'> keyboard_manager: this.model.widget_manager.keyboard_manager });</span> <span class='diff-add'> // Make output area reactive.</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> this.output_area.element.on('changed', function() {</span> <span class='diff-add'> that.model.set('contents', that.output_area.element.html());</span> <span class='diff-add'> });</span> <span class='diff-add'> this.model.on('change:contents', function(){</span> <span class='diff-add'> var html = this.model.get('contents');</span> <span class='diff-add'> if (this.output_area.element.html() != html) {</span> <span class='diff-add'> this.output_area.element.html(html);</span> <span class='diff-add'> }</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> // Set initial contents.</span> <span class='diff-add'> this.output_area.element.html(this.model.get('contents'));</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handles re-routed iopub messages.</span> <span class='diff-add'> */</span> <span class='diff-add'> _handle_route_msg: function(msg) {</span> <span class='diff-add'> if (msg) {</span> <span class='diff-add'> var msg_type = msg.msg_type;</span> <span class='diff-add'> if (msg_type=='clear_output') {</span> <span class='diff-add'> this.output_area.handle_clear_output(msg);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.output_area.handle_output(msg);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> return {</span> <span class='diff-add'> 'OutputView': OutputView,</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_selection.js b/ipynb/Array-feature-overlap-05_files/widget_selection.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..c487834</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_selection.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> "widgets/js/widget",</span> <span class='diff-add'> "base/js/utils",</span> <span class='diff-add'> "jquery",</span> <span class='diff-add'> "underscore",</span> <span class='diff-add'> "bootstrap",</span> <span class='diff-add'>], function(widget, utils, $, _){</span> <span class='diff-add'> var DropdownView = widget.DOMWidgetView.extend({</span> <span class='diff-add'> render : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$el</span> <span class='diff-add'> .addClass('widget-hbox widget-dropdown');</span> <span class='diff-add'> this.$label = $('<div />')</span> <span class='diff-add'> .appendTo(this.$el)</span> <span class='diff-add'> .addClass('widget-label')</span> <span class='diff-add'> .hide();</span> <span class='diff-add'> this.$buttongroup = $('<div />')</span> <span class='diff-add'> .addClass('widget_item')</span> <span class='diff-add'> .addClass('btn-group')</span> <span class='diff-add'> .appendTo(this.$el);</span> <span class='diff-add'> this.$droplabel = $('<button />')</span> <span class='diff-add'> .addClass('btn btn-default')</span> <span class='diff-add'> .addClass('widget-combo-btn')</span> <span class='diff-add'> .html(" ")</span> <span class='diff-add'> .appendTo(this.$buttongroup);</span> <span class='diff-add'> this.$dropbutton = $('<button />')</span> <span class='diff-add'> .addClass('btn btn-default')</span> <span class='diff-add'> .addClass('dropdown-toggle')</span> <span class='diff-add'> .addClass('widget-combo-carrot-btn')</span> <span class='diff-add'> .attr('data-toggle', 'dropdown')</span> <span class='diff-add'> .append($('<span />').addClass("caret"))</span> <span class='diff-add'> .appendTo(this.$buttongroup);</span> <span class='diff-add'> this.$droplist = $('<ul />')</span> <span class='diff-add'> .addClass('dropdown-menu')</span> <span class='diff-add'> .appendTo(this.$buttongroup);</span> <span class='diff-add'> this.model.on('change:button_style', function(model, value) {</span> <span class='diff-add'> this.update_button_style();</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.update_button_style('');</span> <span class='diff-add'> </span> <span class='diff-add'> // Set defaults.</span> <span class='diff-add'> this.update();</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> update : function(options){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been</span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span> <span class='diff-add'> var selected_item_text = this.model.get('selected_label');</span> <span class='diff-add'> if (selected_item_text.trim().length === 0) {</span> <span class='diff-add'> this.$droplabel.html(" ");</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$droplabel.text(selected_item_text);</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> var items = this.model.get('_options_labels');</span> <span class='diff-add'> var $replace_droplist = $('<ul />')</span> <span class='diff-add'> .addClass('dropdown-menu');</span> <span class='diff-add'> // Copy the style</span> <span class='diff-add'> $replace_droplist.attr('style', this.$droplist.attr('style'));</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> _.each(items, function(item, i) {</span> <span class='diff-add'> var item_button = $('<a href="#"/>')</span> <span class='diff-add'> .text(item)</span> <span class='diff-add'> .on('click', $.proxy(that.handle_click, that));</span> <span class='diff-add'> $replace_droplist.append($('<li />').append(item_button));</span> <span class='diff-add'> });</span> <span class='diff-add'> this.$droplist.replaceWith($replace_droplist);</span> <span class='diff-add'> this.$droplist.remove();</span> <span class='diff-add'> this.$droplist = $replace_droplist;</span> <span class='diff-add'> </span> <span class='diff-add'> if (this.model.get('disabled')) {</span> <span class='diff-add'> this.$buttongroup.attr('disabled','disabled');</span> <span class='diff-add'> this.$droplabel.attr('disabled','disabled');</span> <span class='diff-add'> this.$dropbutton.attr('disabled','disabled');</span> <span class='diff-add'> this.$droplist.attr('disabled','disabled');</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$buttongroup.removeAttr('disabled');</span> <span class='diff-add'> this.$droplabel.removeAttr('disabled');</span> <span class='diff-add'> this.$dropbutton.removeAttr('disabled');</span> <span class='diff-add'> this.$droplist.removeAttr('disabled');</span> <span class='diff-add'> }</span> <span class='diff-add'> var description = this.model.get('description');</span> <span class='diff-add'> if (description.length === 0) {</span> <span class='diff-add'> this.$label.hide();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.typeset(this.$label, description);</span> <span class='diff-add'> this.$label.show();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return DropdownView.__super__.update.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> update_button_style: function(previous_trait_value) {</span> <span class='diff-add'> var class_map = {</span> <span class='diff-add'> primary: ['btn-primary'],</span> <span class='diff-add'> success: ['btn-success'],</span> <span class='diff-add'> info: ['btn-info'],</span> <span class='diff-add'> warning: ['btn-warning'],</span> <span class='diff-add'> danger: ['btn-danger']</span> <span class='diff-add'> };</span> <span class='diff-add'> this.update_mapped_classes(class_map, 'button_style', previous_trait_value, this.$droplabel);</span> <span class='diff-add'> this.update_mapped_classes(class_map, 'button_style', previous_trait_value, this.$dropbutton);</span> <span class='diff-add'> },</span> <span class='diff-add'> update_attr: function(name, value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a css attr of the widget view.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (name.substring(0, 6) == 'border' || name == 'background' || name == 'color') {</span> <span class='diff-add'> this.$droplabel.css(name, value);</span> <span class='diff-add'> this.$dropbutton.css(name, value);</span> <span class='diff-add'> this.$droplist.css(name, value);</span> <span class='diff-add'> } else if (name == 'width') {</span> <span class='diff-add'> this.$droplist.css(name, value);</span> <span class='diff-add'> this.$droplabel.css(name, value);</span> <span class='diff-add'> } else if (name == 'padding') {</span> <span class='diff-add'> this.$droplist.css(name, value);</span> <span class='diff-add'> this.$buttongroup.css(name, value);</span> <span class='diff-add'> } else if (name == 'margin') {</span> <span class='diff-add'> this.$buttongroup.css(name, value);</span> <span class='diff-add'> } else if (name == 'height') {</span> <span class='diff-add'> this.$droplabel.css(name, value);</span> <span class='diff-add'> this.$dropbutton.css(name, value);</span> <span class='diff-add'> } else if (name == 'padding' || name == 'margin') {</span> <span class='diff-add'> this.$el.css(name, value);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$droplist.css(name, value);</span> <span class='diff-add'> this.$droplabel.css(name, value);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> handle_click: function (e) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle when a value is clicked.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span> <span class='diff-add'> * model to update.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.model.set('selected_label', $(e.target).text(), {updated_view: this});</span> <span class='diff-add'> this.touch();</span> <span class='diff-add'> // Manually hide the droplist.</span> <span class='diff-add'> e.stopPropagation();</span> <span class='diff-add'> e.preventDefault();</span> <span class='diff-add'> this.$buttongroup.removeClass('open');</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> });</span> <span class='diff-add'> var RadioButtonsView = widget.DOMWidgetView.extend({ </span> <span class='diff-add'> render : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$el</span> <span class='diff-add'> .addClass('widget-hbox widget-radio');</span> <span class='diff-add'> this.$label = $('<div />')</span> <span class='diff-add'> .appendTo(this.$el)</span> <span class='diff-add'> .addClass('widget-label')</span> <span class='diff-add'> .hide();</span> <span class='diff-add'> this.$container = $('<div />')</span> <span class='diff-add'> .appendTo(this.$el)</span> <span class='diff-add'> .addClass('widget-radio-box');</span> <span class='diff-add'> this.update();</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> update : function(options){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span> <span class='diff-add'> // Add missing items to the DOM.</span> <span class='diff-add'> var items = this.model.get('_options_labels');</span> <span class='diff-add'> var disabled = this.model.get('disabled');</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> _.each(items, function(item, index) {</span> <span class='diff-add'> var item_query = ' :input[data-value="' + encodeURIComponent(item) + '"]';</span> <span class='diff-add'> if (that.$el.find(item_query).length === 0) {</span> <span class='diff-add'> var $label = $('<label />')</span> <span class='diff-add'> .addClass('radio')</span> <span class='diff-add'> .text(item)</span> <span class='diff-add'> .appendTo(that.$container);</span> <span class='diff-add'> </span> <span class='diff-add'> $('<input />')</span> <span class='diff-add'> .attr('type', 'radio')</span> <span class='diff-add'> .addClass(that.model)</span> <span class='diff-add'> .val(item)</span> <span class='diff-add'> .attr('data-value', encodeURIComponent(item))</span> <span class='diff-add'> .prependTo($label)</span> <span class='diff-add'> .on('click', $.proxy(that.handle_click, that));</span> <span class='diff-add'> }</span> <span class='diff-add'> </span> <span class='diff-add'> var $item_element = that.$container.find(item_query);</span> <span class='diff-add'> if (that.model.get('selected_label') == item) {</span> <span class='diff-add'> $item_element.prop('checked', true);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> $item_element.prop('checked', false);</span> <span class='diff-add'> }</span> <span class='diff-add'> $item_element.prop('disabled', disabled);</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> // Remove items that no longer exist.</span> <span class='diff-add'> this.$container.find('input').each(function(i, obj) {</span> <span class='diff-add'> var value = $(obj).val();</span> <span class='diff-add'> var found = false;</span> <span class='diff-add'> _.each(items, function(item, index) {</span> <span class='diff-add'> if (item == value) {</span> <span class='diff-add'> found = true;</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> if (!found) {</span> <span class='diff-add'> $(obj).parent().remove();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> var description = this.model.get('description');</span> <span class='diff-add'> if (description.length === 0) {</span> <span class='diff-add'> this.$label.hide();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$label.text(description);</span> <span class='diff-add'> this.typeset(this.$label, description);</span> <span class='diff-add'> this.$label.show();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return RadioButtonsView.__super__.update.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> update_attr: function(name, value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a css attr of the widget view.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span> <span class='diff-add'> this.$el.css(name, value);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$container.css(name, value);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> handle_click: function (e) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle when a value is clicked.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span> <span class='diff-add'> * model to update.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.model.set('selected_label', $(e.target).val(), {updated_view: this});</span> <span class='diff-add'> this.touch();</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> var ToggleButtonsView = widget.DOMWidgetView.extend({</span> <span class='diff-add'> initialize: function() {</span> <span class='diff-add'> this._css_state = {};</span> <span class='diff-add'> ToggleButtonsView.__super__.initialize.apply(this, arguments);</span> <span class='diff-add'> },</span> <span class='diff-add'> render: function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$el</span> <span class='diff-add'> .addClass('widget-hbox widget-toggle-buttons');</span> <span class='diff-add'> this.$label = $('<div />')</span> <span class='diff-add'> .appendTo(this.$el)</span> <span class='diff-add'> .addClass('widget-label')</span> <span class='diff-add'> .hide();</span> <span class='diff-add'> this.$buttongroup = $('<div />')</span> <span class='diff-add'> .addClass('btn-group')</span> <span class='diff-add'> .appendTo(this.$el);</span> <span class='diff-add'> this.model.on('change:button_style', function(model, value) {</span> <span class='diff-add'> this.update_button_style();</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.update_button_style('');</span> <span class='diff-add'> this.update();</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> update : function(options){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span> <span class='diff-add'> // Add missing items to the DOM.</span> <span class='diff-add'> var items = this.model.get('_options_labels');</span> <span class='diff-add'> var disabled = this.model.get('disabled');</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var item_html;</span> <span class='diff-add'> _.each(items, function(item, index) {</span> <span class='diff-add'> if (item.trim().length === 0) {</span> <span class='diff-add'> item_html = " ";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> item_html = utils.escape_html(item);</span> <span class='diff-add'> }</span> <span class='diff-add'> var item_query = '[data-value="' + encodeURIComponent(item) + '"]';</span> <span class='diff-add'> var $item_element = that.$buttongroup.find(item_query);</span> <span class='diff-add'> if (!$item_element.length) {</span> <span class='diff-add'> $item_element = $('<button/>')</span> <span class='diff-add'> .attr('type', 'button')</span> <span class='diff-add'> .addClass('btn btn-default')</span> <span class='diff-add'> .html(item_html)</span> <span class='diff-add'> .appendTo(that.$buttongroup)</span> <span class='diff-add'> .attr('data-value', encodeURIComponent(item))</span> <span class='diff-add'> .attr('value', item)</span> <span class='diff-add'> .on('click', $.proxy(that.handle_click, that));</span> <span class='diff-add'> that.update_style_traits($item_element);</span> <span class='diff-add'> }</span> <span class='diff-add'> if (that.model.get('selected_label') == item) {</span> <span class='diff-add'> $item_element.addClass('active');</span> <span class='diff-add'> } else {</span> <span class='diff-add'> $item_element.removeClass('active');</span> <span class='diff-add'> }</span> <span class='diff-add'> $item_element.prop('disabled', disabled); </span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> // Remove items that no longer exist.</span> <span class='diff-add'> this.$buttongroup.find('button').each(function(i, obj) {</span> <span class='diff-add'> var value = $(obj).attr('value');</span> <span class='diff-add'> var found = false;</span> <span class='diff-add'> _.each(items, function(item, index) {</span> <span class='diff-add'> if (item == value) {</span> <span class='diff-add'> found = true;</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> if (!found) {</span> <span class='diff-add'> $(obj).remove();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> var description = this.model.get('description');</span> <span class='diff-add'> if (description.length === 0) {</span> <span class='diff-add'> this.$label.hide();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$label.text();</span> <span class='diff-add'> this.typeset(this.$label, description);</span> <span class='diff-add'> this.$label.show();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return ToggleButtonsView.__super__.update.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> update_attr: function(name, value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a css attr of the widget view.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span> <span class='diff-add'> this.$el.css(name, value);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this._css_state[name] = value;</span> <span class='diff-add'> this.update_style_traits();</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> update_style_traits: function(button) {</span> <span class='diff-add'> for (var name in this._css_state) {</span> <span class='diff-add'> if (this._css_state.hasOwnProperty(name)) {</span> <span class='diff-add'> if (name == 'margin') {</span> <span class='diff-add'> this.$buttongroup.css(name, this._css_state[name]);</span> <span class='diff-add'> } else if (name != 'width') {</span> <span class='diff-add'> if (button) {</span> <span class='diff-add'> button.css(name, this._css_state[name]);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$buttongroup.find('button').css(name, this._css_state[name]);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> update_button_style: function(previous_trait_value) {</span> <span class='diff-add'> var class_map = {</span> <span class='diff-add'> primary: ['btn-primary'],</span> <span class='diff-add'> success: ['btn-success'],</span> <span class='diff-add'> info: ['btn-info'],</span> <span class='diff-add'> warning: ['btn-warning'],</span> <span class='diff-add'> danger: ['btn-danger']</span> <span class='diff-add'> };</span> <span class='diff-add'> this.update_mapped_classes(class_map, 'button_style', previous_trait_value, this.$buttongroup.find('button'));</span> <span class='diff-add'> },</span> <span class='diff-add'> handle_click: function (e) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle when a value is clicked.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span> <span class='diff-add'> * model to update.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.model.set('selected_label', $(e.target).attr('value'), {updated_view: this});</span> <span class='diff-add'> this.touch();</span> <span class='diff-add'> }, </span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> var SelectView = widget.DOMWidgetView.extend({ </span> <span class='diff-add'> render : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$el</span> <span class='diff-add'> .addClass('widget-hbox widget-select');</span> <span class='diff-add'> this.$label = $('<div />')</span> <span class='diff-add'> .appendTo(this.$el)</span> <span class='diff-add'> .addClass('widget-label')</span> <span class='diff-add'> .hide();</span> <span class='diff-add'> this.$listbox = $('<select />')</span> <span class='diff-add'> .addClass('widget-listbox form-control')</span> <span class='diff-add'> .attr('size', 6)</span> <span class='diff-add'> .appendTo(this.$el)</span> <span class='diff-add'> .on('change', $.proxy(this.handle_change, this));</span> <span class='diff-add'> this.update();</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> update : function(options){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span> <span class='diff-add'> // Add missing items to the DOM.</span> <span class='diff-add'> var items = this.model.get('_options_labels');</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> _.each(items, function(item, index) {</span> <span class='diff-add'> var item_query = 'option[data-value="' + encodeURIComponent(item) + '"]';</span> <span class='diff-add'> if (that.$listbox.find(item_query).length === 0) {</span> <span class='diff-add'> $('<option />')</span> <span class='diff-add'> .text(item)</span> <span class='diff-add'> .attr('data-value', encodeURIComponent(item))</span> <span class='diff-add'> .attr('selected_label', item)</span> <span class='diff-add'> .on("click", $.proxy(that.handle_click, that))</span> <span class='diff-add'> .appendTo(that.$listbox);</span> <span class='diff-add'> } </span> <span class='diff-add'> });</span> <span class='diff-add'> // Select the correct element</span> <span class='diff-add'> this.$listbox.val(this.model.get('selected_label'));</span> <span class='diff-add'> </span> <span class='diff-add'> // Disable listbox if needed</span> <span class='diff-add'> var disabled = this.model.get('disabled');</span> <span class='diff-add'> this.$listbox.prop('disabled', disabled);</span> <span class='diff-add'> // Remove items that no longer exist.</span> <span class='diff-add'> this.$listbox.find('option').each(function(i, obj) {</span> <span class='diff-add'> var value = $(obj).text();</span> <span class='diff-add'> var found = false;</span> <span class='diff-add'> _.each(items, function(item, index) {</span> <span class='diff-add'> if (item == value) {</span> <span class='diff-add'> found = true;</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> if (!found) {</span> <span class='diff-add'> $(obj).remove();</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> var description = this.model.get('description');</span> <span class='diff-add'> if (description.length === 0) {</span> <span class='diff-add'> this.$label.hide();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.typeset(this.$label, description);</span> <span class='diff-add'> this.$label.show();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return SelectView.__super__.update.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> update_attr: function(name, value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a css attr of the widget view.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span> <span class='diff-add'> this.$el.css(name, value);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$listbox.css(name, value);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> handle_click: function (e) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle when a new value is clicked.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$listbox.val($(e.target).val()).change();</span> <span class='diff-add'> },</span> <span class='diff-add'> handle_change: function (e) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle when a new value is selected.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span> <span class='diff-add'> * model to update.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.model.set('selected_label', this.$listbox.val(), {updated_view: this});</span> <span class='diff-add'> this.touch();</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> var SelectMultipleView = SelectView.extend({</span> <span class='diff-add'> render: function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> SelectMultipleView.__super__.render.apply(this);</span> <span class='diff-add'> this.$el.removeClass('widget-select')</span> <span class='diff-add'> .addClass('widget-select-multiple');</span> <span class='diff-add'> this.$listbox.attr('multiple', true)</span> <span class='diff-add'> .on('change', $.proxy(this.handle_change, this));</span> <span class='diff-add'> return this;</span> <span class='diff-add'> },</span> <span class='diff-add'> update: function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> SelectMultipleView.__super__.update.apply(this, arguments);</span> <span class='diff-add'> this.$listbox.val(this.model.get('selected_labels'));</span> <span class='diff-add'> },</span> <span class='diff-add'> handle_change: function (e) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle when a new value is selected.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span> <span class='diff-add'> * model to update.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.model.set('selected_labels',</span> <span class='diff-add'> (this.$listbox.val() || []).slice(),</span> <span class='diff-add'> {updated_view: this});</span> <span class='diff-add'> this.touch();</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> return {</span> <span class='diff-add'> 'DropdownView': DropdownView,</span> <span class='diff-add'> 'RadioButtonsView': RadioButtonsView,</span> <span class='diff-add'> 'ToggleButtonsView': ToggleButtonsView,</span> <span class='diff-add'> 'SelectView': SelectView,</span> <span class='diff-add'> 'SelectMultipleView': SelectMultipleView,</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_selectioncontainer.js b/ipynb/Array-feature-overlap-05_files/widget_selectioncontainer.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..446a236</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_selectioncontainer.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> "widgets/js/widget",</span> <span class='diff-add'> "base/js/utils",</span> <span class='diff-add'> "jquery",</span> <span class='diff-add'> "bootstrap",</span> <span class='diff-add'>], function(widget, utils, $){</span> <span class='diff-add'> var AccordionView = widget.DOMWidgetView.extend({</span> <span class='diff-add'> initialize: function(){</span> <span class='diff-add'> AccordionView.__super__.initialize.apply(this, arguments);</span> <span class='diff-add'> this.containers = [];</span> <span class='diff-add'> this.model_containers = {};</span> <span class='diff-add'> this.children_views = new widget.ViewList(this.add_child_view, this.remove_child_view, this);</span> <span class='diff-add'> this.listenTo(this.model, 'change:children', function(model, value) {</span> <span class='diff-add'> this.children_views.update(value);</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> },</span> <span class='diff-add'> render: function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> var guid = 'panel-group' + utils.uuid();</span> <span class='diff-add'> this.$el</span> <span class='diff-add'> .attr('id', guid)</span> <span class='diff-add'> .addClass('panel-group');</span> <span class='diff-add'> this.model.on('change:selected_index', function(model, value, options) {</span> <span class='diff-add'> this.update_selected_index(options);</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.model.on('change:_titles', function(model, value, options) {</span> <span class='diff-add'> this.update_titles(options);</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.on('displayed', function() {</span> <span class='diff-add'> this.update_titles();</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.children_views.update(this.model.get('children'));</span> <span class='diff-add'> },</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> update: function(options) {</span> <span class='diff-add'> this.update_titles();</span> <span class='diff-add'> this.update_selected_index(options);</span> <span class='diff-add'> return TabView.__super__.update.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> update_titles: function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set tab titles</span> <span class='diff-add'> */</span> <span class='diff-add'> var titles = this.model.get('_titles');</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> _.each(titles, function(title, page_index) {</span> <span class='diff-add'> var accordian = that.containers[page_index];</span> <span class='diff-add'> if (accordian !== undefined) {</span> <span class='diff-add'> accordian</span> <span class='diff-add'> .find('.panel-heading')</span> <span class='diff-add'> .find('.accordion-toggle')</span> <span class='diff-add'> .text(title);</span> <span class='diff-add'> }</span> <span class='diff-add'> });</span> <span class='diff-add'> },</span> <span class='diff-add'> update_selected_index: function(options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Only update the selection if the selection wasn't triggered</span> <span class='diff-add'> * by the front-end. It must be triggered by the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span> <span class='diff-add'> var old_index = this.model.previous('selected_index');</span> <span class='diff-add'> var new_index = this.model.get('selected_index');</span> <span class='diff-add'> this.containers[old_index].find('.panel-collapse').collapse('hide');</span> <span class='diff-add'> if (0 <= new_index && new_index < this.containers.length) {</span> <span class='diff-add'> this.containers[new_index].find('.panel-collapse').collapse('show');</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> remove_child_view: function(view) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when a child is removed from children list.</span> <span class='diff-add'> * TODO: does this handle two different views of the same model as children?</span> <span class='diff-add'> */</span> <span class='diff-add'> var model = view.model;</span> <span class='diff-add'> var accordion_group = this.model_containers[model.id];</span> <span class='diff-add'> this.containers.splice(accordion_group.container_index, 1);</span> <span class='diff-add'> delete this.model_containers[model.id];</span> <span class='diff-add'> accordion_group.remove();</span> <span class='diff-add'> },</span> <span class='diff-add'> add_child_view: function(model) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when a child is added to children list.</span> <span class='diff-add'> */</span> <span class='diff-add'> var index = this.containers.length;</span> <span class='diff-add'> var uuid = utils.uuid();</span> <span class='diff-add'> var accordion_group = $('<div />')</span> <span class='diff-add'> .addClass('panel panel-default')</span> <span class='diff-add'> .appendTo(this.$el);</span> <span class='diff-add'> var accordion_heading = $('<div />')</span> <span class='diff-add'> .addClass('panel-heading')</span> <span class='diff-add'> .appendTo(accordion_group);</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var accordion_toggle = $('<a />')</span> <span class='diff-add'> .addClass('accordion-toggle')</span> <span class='diff-add'> .attr('data-toggle', 'collapse')</span> <span class='diff-add'> .attr('data-parent', '#' + this.$el.attr('id'))</span> <span class='diff-add'> .attr('href', '#' + uuid)</span> <span class='diff-add'> .click(function(evt){ </span> <span class='diff-add'> </span> <span class='diff-add'> // Calling model.set will trigger all of the other views of the </span> <span class='diff-add'> // model to update.</span> <span class='diff-add'> that.model.set("selected_index", index, {updated_view: that});</span> <span class='diff-add'> that.touch();</span> <span class='diff-add'> })</span> <span class='diff-add'> .text('Page ' + index)</span> <span class='diff-add'> .appendTo(accordion_heading);</span> <span class='diff-add'> var accordion_body = $('<div />', {id: uuid})</span> <span class='diff-add'> .addClass('panel-collapse collapse')</span> <span class='diff-add'> .appendTo(accordion_group);</span> <span class='diff-add'> var accordion_inner = $('<div />')</span> <span class='diff-add'> .addClass('panel-body')</span> <span class='diff-add'> .appendTo(accordion_body);</span> <span class='diff-add'> var container_index = this.containers.push(accordion_group) - 1;</span> <span class='diff-add'> accordion_group.container_index = container_index;</span> <span class='diff-add'> this.model_containers[model.id] = accordion_group;</span> <span class='diff-add'> </span> <span class='diff-add'> var dummy = $('<div/>');</span> <span class='diff-add'> accordion_inner.append(dummy);</span> <span class='diff-add'> return this.create_child_view(model).then(function(view) {</span> <span class='diff-add'> dummy.replaceWith(view.$el);</span> <span class='diff-add'> that.update();</span> <span class='diff-add'> that.update_titles();</span> <span class='diff-add'> // Trigger the displayed event of the child view.</span> <span class='diff-add'> that.after_displayed(function() {</span> <span class='diff-add'> view.trigger('displayed');</span> <span class='diff-add'> });</span> <span class='diff-add'> return view;</span> <span class='diff-add'> }).catch(utils.reject("Couldn't add child view to box", true));</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> remove: function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * We remove this widget before removing the children as an optimization</span> <span class='diff-add'> * we want to remove the entire container from the DOM first before</span> <span class='diff-add'> * removing each individual child separately.</span> <span class='diff-add'> */</span> <span class='diff-add'> AccordionView.__super__.remove.apply(this, arguments);</span> <span class='diff-add'> this.children_views.remove();</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> </span> <span class='diff-add'> var TabView = widget.DOMWidgetView.extend({ </span> <span class='diff-add'> initialize: function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Public constructor.</span> <span class='diff-add'> */</span> <span class='diff-add'> TabView.__super__.initialize.apply(this, arguments);</span> <span class='diff-add'> </span> <span class='diff-add'> this.containers = [];</span> <span class='diff-add'> this.children_views = new widget.ViewList(this.add_child_view, this.remove_child_view, this);</span> <span class='diff-add'> this.listenTo(this.model, 'change:children', function(model, value) {</span> <span class='diff-add'> this.children_views.update(value);</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> },</span> <span class='diff-add'> render: function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> var uuid = 'tabs'+utils.uuid();</span> <span class='diff-add'> this.$tabs = $('<div />', {id: uuid})</span> <span class='diff-add'> .addClass('nav')</span> <span class='diff-add'> .addClass('nav-tabs')</span> <span class='diff-add'> .appendTo(this.$el);</span> <span class='diff-add'> this.$tab_contents = $('<div />', {id: uuid + 'Content'})</span> <span class='diff-add'> .addClass('tab-content')</span> <span class='diff-add'> .appendTo(this.$el);</span> <span class='diff-add'> this.children_views.update(this.model.get('children'));</span> <span class='diff-add'> },</span> <span class='diff-add'> update_attr: function(name, value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a css attr of the widget view.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span> <span class='diff-add'> this.$el.css(name, value);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$tabs.css(name, value);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> remove_child_view: function(view) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when a child is removed from children list.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.containers.splice(view.parent_tab.tab_text_index, 1);</span> <span class='diff-add'> view.parent_tab.remove();</span> <span class='diff-add'> view.parent_container.remove();</span> <span class='diff-add'> view.remove();</span> <span class='diff-add'> },</span> <span class='diff-add'> add_child_view: function(model) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when a child is added to children list.</span> <span class='diff-add'> */</span> <span class='diff-add'> var index = this.containers.length;</span> <span class='diff-add'> var uuid = utils.uuid();</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> var tab = $('<li />')</span> <span class='diff-add'> .css('list-style-type', 'none')</span> <span class='diff-add'> .appendTo(this.$tabs);</span> <span class='diff-add'> var tab_text = $('<a />')</span> <span class='diff-add'> .attr('href', '#' + uuid)</span> <span class='diff-add'> .attr('data-toggle', 'tab') </span> <span class='diff-add'> .text('Page ' + index)</span> <span class='diff-add'> .appendTo(tab)</span> <span class='diff-add'> .click(function (e) {</span> <span class='diff-add'> </span> <span class='diff-add'> // Calling model.set will trigger all of the other views of the </span> <span class='diff-add'> // model to update.</span> <span class='diff-add'> that.model.set("selected_index", index, {updated_view: that});</span> <span class='diff-add'> that.touch();</span> <span class='diff-add'> that.select_page(index);</span> <span class='diff-add'> });</span> <span class='diff-add'> tab.tab_text_index = that.containers.push(tab_text) - 1;</span> <span class='diff-add'> var dummy = $('<div />');</span> <span class='diff-add'> var contents_div = $('<div />', {id: uuid})</span> <span class='diff-add'> .addClass('tab-pane')</span> <span class='diff-add'> .addClass('fade')</span> <span class='diff-add'> .append(dummy)</span> <span class='diff-add'> .appendTo(that.$tab_contents);</span> <span class='diff-add'> this.update();</span> <span class='diff-add'> return this.create_child_view(model).then(function(view) {</span> <span class='diff-add'> dummy.replaceWith(view.$el);</span> <span class='diff-add'> view.parent_tab = tab;</span> <span class='diff-add'> view.parent_container = contents_div;</span> <span class='diff-add'> // Trigger the displayed event of the child view.</span> <span class='diff-add'> that.after_displayed(function() {</span> <span class='diff-add'> view.trigger('displayed');</span> <span class='diff-add'> that.update();</span> <span class='diff-add'> });</span> <span class='diff-add'> return view;</span> <span class='diff-add'> }).catch(utils.reject("Couldn't add child view to box", true));</span> <span class='diff-add'> },</span> <span class='diff-add'> update: function(options) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.update_titles();</span> <span class='diff-add'> this.update_selected_index(options);</span> <span class='diff-add'> return TabView.__super__.update.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Updates the tab page titles.</span> <span class='diff-add'> */</span> <span class='diff-add'> update_titles: function() {</span> <span class='diff-add'> var titles = this.model.get('_titles');</span> <span class='diff-add'> var that = this;</span> <span class='diff-add'> _.each(titles, function(title, page_index) {</span> <span class='diff-add'> var tab_text = that.containers[page_index];</span> <span class='diff-add'> if (tab_text !== undefined) {</span> <span class='diff-add'> tab_text.text(title);</span> <span class='diff-add'> } </span> <span class='diff-add'> });</span> <span class='diff-add'> },</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Updates the tab page titles.</span> <span class='diff-add'> */</span> <span class='diff-add'> update_selected_index: function(options) {</span> <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span> <span class='diff-add'> var selected_index = this.model.get('selected_index');</span> <span class='diff-add'> if (0 <= selected_index && selected_index < this.containers.length) {</span> <span class='diff-add'> this.select_page(selected_index);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> select_page: function(index) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Select a page.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$tabs.find('li')</span> <span class='diff-add'> .removeClass('active');</span> <span class='diff-add'> this.containers[index].tab('show');</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> remove: function() {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * We remove this widget before removing the children as an optimization</span> <span class='diff-add'> * we want to remove the entire container from the DOM first before</span> <span class='diff-add'> * removing each individual child separately.</span> <span class='diff-add'> */</span> <span class='diff-add'> TabView.__super__.remove.apply(this, arguments);</span> <span class='diff-add'> this.children_views.remove();</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> return {</span> <span class='diff-add'> 'AccordionView': AccordionView,</span> <span class='diff-add'> 'TabView': TabView,</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_string.js b/ipynb/Array-feature-overlap-05_files/widget_string.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..81bd8e3</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_string.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span> <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span> <span class='diff-add'>define([</span> <span class='diff-add'> "widgets/js/widget",</span> <span class='diff-add'> "jquery",</span> <span class='diff-add'> "bootstrap",</span> <span class='diff-add'>], function(widget, $){</span> <span class='diff-add'> var HTMLView = widget.DOMWidgetView.extend({ </span> <span class='diff-add'> render : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.update(); // Set defaults.</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> update : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$el.html(this.model.get('value')); // CAUTION! .html(...) CALL MANDITORY!!!</span> <span class='diff-add'> return HTMLView.__super__.update.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> var LatexView = widget.DOMWidgetView.extend({ </span> <span class='diff-add'> render : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.update(); // Set defaults.</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> update : function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.typeset(this.$el, this.model.get('value'));</span> <span class='diff-add'> return LatexView.__super__.update.apply(this);</span> <span class='diff-add'> }, </span> <span class='diff-add'> });</span> <span class='diff-add'> var TextareaView = widget.DOMWidgetView.extend({ </span> <span class='diff-add'> render: function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$el</span> <span class='diff-add'> .addClass('widget-hbox widget-textarea');</span> <span class='diff-add'> this.$label = $('<div />')</span> <span class='diff-add'> .appendTo(this.$el)</span> <span class='diff-add'> .addClass('widget-label')</span> <span class='diff-add'> .hide();</span> <span class='diff-add'> this.$textbox = $('<textarea />')</span> <span class='diff-add'> .attr('rows', 5)</span> <span class='diff-add'> .addClass('widget-text form-control')</span> <span class='diff-add'> .appendTo(this.$el);</span> <span class='diff-add'> this.update(); // Set defaults.</span> <span class='diff-add'> this.model.on('msg:custom', $.proxy(this._handle_textarea_msg, this));</span> <span class='diff-add'> this.model.on('change:placeholder', function(model, value, options) {</span> <span class='diff-add'> this.update_placeholder(value);</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.update_placeholder();</span> <span class='diff-add'> },</span> <span class='diff-add'> _handle_textarea_msg: function (content){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handle when a custom msg is recieved from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (content.method == "scroll_to_bottom") {</span> <span class='diff-add'> this.scroll_to_bottom(); </span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> update_placeholder: function(value) {</span> <span class='diff-add'> if (!value) {</span> <span class='diff-add'> value = this.model.get('placeholder');</span> <span class='diff-add'> }</span> <span class='diff-add'> this.$textbox.attr('placeholder', value);</span> <span class='diff-add'> },</span> <span class='diff-add'> scroll_to_bottom: function (){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Scroll the text-area view to the bottom.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$textbox.scrollTop(this.$textbox[0].scrollHeight);</span> <span class='diff-add'> },</span> <span class='diff-add'> update: function(options){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span> <span class='diff-add'> this.$textbox.val(this.model.get('value'));</span> <span class='diff-add'> var disabled = this.model.get('disabled');</span> <span class='diff-add'> this.$textbox.prop('disabled', disabled);</span> <span class='diff-add'> var description = this.model.get('description');</span> <span class='diff-add'> if (description.length === 0) {</span> <span class='diff-add'> this.$label.hide();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.typeset(this.$label, description);</span> <span class='diff-add'> this.$label.show();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return TextareaView.__super__.update.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> update_attr: function(name, value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a css attr of the widget view.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span> <span class='diff-add'> this.$el.css(name, value);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$textbox.css(name, value);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> events: {</span> <span class='diff-add'> // Dictionary of events and their handlers.</span> <span class='diff-add'> "keyup textarea" : "handleChanging",</span> <span class='diff-add'> "paste textarea" : "handleChanging",</span> <span class='diff-add'> "cut textarea" : "handleChanging"</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> handleChanging: function(e) { </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handles and validates user input.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span> <span class='diff-add'> * model to update.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.model.set('value', e.target.value, {updated_view: this});</span> <span class='diff-add'> this.touch();</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> var TextView = widget.DOMWidgetView.extend({ </span> <span class='diff-add'> render: function(){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Called when view is rendered.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.$el</span> <span class='diff-add'> .addClass('widget-hbox widget-text');</span> <span class='diff-add'> this.$label = $('<div />')</span> <span class='diff-add'> .addClass('widget-label')</span> <span class='diff-add'> .appendTo(this.$el)</span> <span class='diff-add'> .hide();</span> <span class='diff-add'> this.$textbox = $('<input type="text" />')</span> <span class='diff-add'> .addClass('input')</span> <span class='diff-add'> .addClass('widget-text form-control')</span> <span class='diff-add'> .appendTo(this.$el);</span> <span class='diff-add'> this.update(); // Set defaults.</span> <span class='diff-add'> this.model.on('change:placeholder', function(model, value, options) {</span> <span class='diff-add'> this.update_placeholder(value);</span> <span class='diff-add'> }, this);</span> <span class='diff-add'> this.update_placeholder();</span> <span class='diff-add'> },</span> <span class='diff-add'> update_placeholder: function(value) {</span> <span class='diff-add'> if (!value) {</span> <span class='diff-add'> value = this.model.get('placeholder');</span> <span class='diff-add'> }</span> <span class='diff-add'> this.$textbox.attr('placeholder', value);</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> update: function(options){</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Update the contents of this view</span> <span class='diff-add'> *</span> <span class='diff-add'> * Called when the model is changed. The model may have been </span> <span class='diff-add'> * changed by another view or by a state update from the back-end.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span> <span class='diff-add'> if (this.$textbox.val() != this.model.get('value')) {</span> <span class='diff-add'> this.$textbox.val(this.model.get('value'));</span> <span class='diff-add'> }</span> <span class='diff-add'> var disabled = this.model.get('disabled');</span> <span class='diff-add'> this.$textbox.prop('disabled', disabled);</span> <span class='diff-add'> var description = this.model.get('description');</span> <span class='diff-add'> if (description.length === 0) {</span> <span class='diff-add'> this.$label.hide();</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.typeset(this.$label, description);</span> <span class='diff-add'> this.$label.show();</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return TextView.__super__.update.apply(this);</span> <span class='diff-add'> },</span> <span class='diff-add'> update_attr: function(name, value) {</span> <span class='diff-add'> /**</span> <span class='diff-add'> * Set a css attr of the widget view.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span> <span class='diff-add'> this.$el.css(name, value);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> this.$textbox.css(name, value);</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> events: {</span> <span class='diff-add'> // Dictionary of events and their handlers.</span> <span class='diff-add'> "keyup input" : "handleChanging",</span> <span class='diff-add'> "paste input" : "handleChanging",</span> <span class='diff-add'> "cut input" : "handleChanging",</span> <span class='diff-add'> "keypress input" : "handleKeypress",</span> <span class='diff-add'> "blur input" : "handleBlur",</span> <span class='diff-add'> "focusout input" : "handleFocusOut"</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> handleChanging: function(e) { </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handles user input.</span> <span class='diff-add'> *</span> <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span> <span class='diff-add'> * model to update.</span> <span class='diff-add'> */</span> <span class='diff-add'> this.model.set('value', e.target.value, {updated_view: this});</span> <span class='diff-add'> this.touch();</span> <span class='diff-add'> },</span> <span class='diff-add'> </span> <span class='diff-add'> handleKeypress: function(e) { </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Handles text submition</span> <span class='diff-add'> */</span> <span class='diff-add'> if (e.keyCode == 13) { // Return key</span> <span class='diff-add'> this.send({event: 'submit'});</span> <span class='diff-add'> e.stopPropagation();</span> <span class='diff-add'> e.preventDefault();</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> handleBlur: function(e) { </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Prevent a blur from firing if the blur was not user intended.</span> <span class='diff-add'> * This is a workaround for the return-key focus loss bug.</span> <span class='diff-add'> * TODO: Is the original bug actually a fault of the keyboard</span> <span class='diff-add'> * manager?</span> <span class='diff-add'> */</span> <span class='diff-add'> if (e.relatedTarget === null) {</span> <span class='diff-add'> e.stopPropagation();</span> <span class='diff-add'> e.preventDefault();</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> handleFocusOut: function(e) { </span> <span class='diff-add'> /**</span> <span class='diff-add'> * Prevent a blur from firing if the blur was not user intended.</span> <span class='diff-add'> * This is a workaround for the return-key focus loss bug.</span> <span class='diff-add'> */</span> <span class='diff-add'> if (e.relatedTarget === null) {</span> <span class='diff-add'> e.stopPropagation();</span> <span class='diff-add'> e.preventDefault();</span> <span class='diff-add'> return false;</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> });</span> <span class='diff-add'> return {</span> <span class='diff-add'> 'HTMLView': HTMLView,</span> <span class='diff-add'> 'LatexView': LatexView,</span> <span class='diff-add'> 'TextareaView': TextareaView,</span> <span class='diff-add'> 'TextView': TextView,</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/xml.js b/ipynb/Array-feature-overlap-05_files/xml.js</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..2f3b8f8</span> <span class='hidden' style='font-size:75%'>--- /dev/null</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/xml.js</span> <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span> <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span> <span class='diff-add'>(function(mod) {</span> <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span> <span class='diff-add'> mod(require("../../lib/codemirror"));</span> <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span> <span class='diff-add'> define(["../../lib/codemirror"], mod);</span> <span class='diff-add'> else // Plain browser env</span> <span class='diff-add'> mod(CodeMirror);</span> <span class='diff-add'>})(function(CodeMirror) {</span> <span class='diff-add'>"use strict";</span> <span class='diff-add'>CodeMirror.defineMode("xml", function(config, parserConfig) {</span> <span class='diff-add'> var indentUnit = config.indentUnit;</span> <span class='diff-add'> var multilineTagIndentFactor = parserConfig.multilineTagIndentFactor || 1;</span> <span class='diff-add'> var multilineTagIndentPastTag = parserConfig.multilineTagIndentPastTag;</span> <span class='diff-add'> if (multilineTagIndentPastTag == null) multilineTagIndentPastTag = true;</span> <span class='diff-add'> var Kludges = parserConfig.htmlMode ? {</span> <span class='diff-add'> autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,</span> <span class='diff-add'> 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,</span> <span class='diff-add'> 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,</span> <span class='diff-add'> 'track': true, 'wbr': true, 'menuitem': true},</span> <span class='diff-add'> implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,</span> <span class='diff-add'> 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,</span> <span class='diff-add'> 'th': true, 'tr': true},</span> <span class='diff-add'> contextGrabbers: {</span> <span class='diff-add'> 'dd': {'dd': true, 'dt': true},</span> <span class='diff-add'> 'dt': {'dd': true, 'dt': true},</span> <span class='diff-add'> 'li': {'li': true},</span> <span class='diff-add'> 'option': {'option': true, 'optgroup': true},</span> <span class='diff-add'> 'optgroup': {'optgroup': true},</span> <span class='diff-add'> 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,</span> <span class='diff-add'> 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,</span> <span class='diff-add'> 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,</span> <span class='diff-add'> 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,</span> <span class='diff-add'> 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},</span> <span class='diff-add'> 'rp': {'rp': true, 'rt': true},</span> <span class='diff-add'> 'rt': {'rp': true, 'rt': true},</span> <span class='diff-add'> 'tbody': {'tbody': true, 'tfoot': true},</span> <span class='diff-add'> 'td': {'td': true, 'th': true},</span> <span class='diff-add'> 'tfoot': {'tbody': true},</span> <span class='diff-add'> 'th': {'td': true, 'th': true},</span> <span class='diff-add'> 'thead': {'tbody': true, 'tfoot': true},</span> <span class='diff-add'> 'tr': {'tr': true}</span> <span class='diff-add'> },</span> <span class='diff-add'> doNotIndent: {"pre": true},</span> <span class='diff-add'> allowUnquoted: true,</span> <span class='diff-add'> allowMissing: true,</span> <span class='diff-add'> caseFold: true</span> <span class='diff-add'> } : {</span> <span class='diff-add'> autoSelfClosers: {},</span> <span class='diff-add'> implicitlyClosed: {},</span> <span class='diff-add'> contextGrabbers: {},</span> <span class='diff-add'> doNotIndent: {},</span> <span class='diff-add'> allowUnquoted: false,</span> <span class='diff-add'> allowMissing: false,</span> <span class='diff-add'> caseFold: false</span> <span class='diff-add'> };</span> <span class='diff-add'> var alignCDATA = parserConfig.alignCDATA;</span> <span class='diff-add'> // Return variables for tokenizers</span> <span class='diff-add'> var type, setStyle;</span> <span class='diff-add'> function inText(stream, state) {</span> <span class='diff-add'> function chain(parser) {</span> <span class='diff-add'> state.tokenize = parser;</span> <span class='diff-add'> return parser(stream, state);</span> <span class='diff-add'> }</span> <span class='diff-add'> var ch = stream.next();</span> <span class='diff-add'> if (ch == "<") {</span> <span class='diff-add'> if (stream.eat("!")) {</span> <span class='diff-add'> if (stream.eat("[")) {</span> <span class='diff-add'> if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>"));</span> <span class='diff-add'> else return null;</span> <span class='diff-add'> } else if (stream.match("--")) {</span> <span class='diff-add'> return chain(inBlock("comment", "-->"));</span> <span class='diff-add'> } else if (stream.match("DOCTYPE", true, true)) {</span> <span class='diff-add'> stream.eatWhile(/[\w\._\-]/);</span> <span class='diff-add'> return chain(doctype(1));</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (stream.eat("?")) {</span> <span class='diff-add'> stream.eatWhile(/[\w\._\-]/);</span> <span class='diff-add'> state.tokenize = inBlock("meta", "?>");</span> <span class='diff-add'> return "meta";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> type = stream.eat("/") ? "closeTag" : "openTag";</span> <span class='diff-add'> state.tokenize = inTag;</span> <span class='diff-add'> return "tag bracket";</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (ch == "&") {</span> <span class='diff-add'> var ok;</span> <span class='diff-add'> if (stream.eat("#")) {</span> <span class='diff-add'> if (stream.eat("x")) {</span> <span class='diff-add'> ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";");</span> <span class='diff-add'> } else {</span> <span class='diff-add'> ok = stream.eatWhile(/[\d]/) && stream.eat(";");</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";");</span> <span class='diff-add'> }</span> <span class='diff-add'> return ok ? "atom" : "error";</span> <span class='diff-add'> } else {</span> <span class='diff-add'> stream.eatWhile(/[^&<]/);</span> <span class='diff-add'> return null;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function inTag(stream, state) {</span> <span class='diff-add'> var ch = stream.next();</span> <span class='diff-add'> if (ch == ">" || (ch == "/" && stream.eat(">"))) {</span> <span class='diff-add'> state.tokenize = inText;</span> <span class='diff-add'> type = ch == ">" ? "endTag" : "selfcloseTag";</span> <span class='diff-add'> return "tag bracket";</span> <span class='diff-add'> } else if (ch == "=") {</span> <span class='diff-add'> type = "equals";</span> <span class='diff-add'> return null;</span> <span class='diff-add'> } else if (ch == "<") {</span> <span class='diff-add'> state.tokenize = inText;</span> <span class='diff-add'> state.state = baseState;</span> <span class='diff-add'> state.tagName = state.tagStart = null;</span> <span class='diff-add'> var next = state.tokenize(stream, state);</span> <span class='diff-add'> return next ? next + " tag error" : "tag error";</span> <span class='diff-add'> } else if (/[\'\"]/.test(ch)) {</span> <span class='diff-add'> state.tokenize = inAttribute(ch);</span> <span class='diff-add'> state.stringStartCol = stream.column();</span> <span class='diff-add'> return state.tokenize(stream, state);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> stream.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/);</span> <span class='diff-add'> return "word";</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function inAttribute(quote) {</span> <span class='diff-add'> var closure = function(stream, state) {</span> <span class='diff-add'> while (!stream.eol()) {</span> <span class='diff-add'> if (stream.next() == quote) {</span> <span class='diff-add'> state.tokenize = inTag;</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return "string";</span> <span class='diff-add'> };</span> <span class='diff-add'> closure.isInAttribute = true;</span> <span class='diff-add'> return closure;</span> <span class='diff-add'> }</span> <span class='diff-add'> function inBlock(style, terminator) {</span> <span class='diff-add'> return function(stream, state) {</span> <span class='diff-add'> while (!stream.eol()) {</span> <span class='diff-add'> if (stream.match(terminator)) {</span> <span class='diff-add'> state.tokenize = inText;</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> stream.next();</span> <span class='diff-add'> }</span> <span class='diff-add'> return style;</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> function doctype(depth) {</span> <span class='diff-add'> return function(stream, state) {</span> <span class='diff-add'> var ch;</span> <span class='diff-add'> while ((ch = stream.next()) != null) {</span> <span class='diff-add'> if (ch == "<") {</span> <span class='diff-add'> state.tokenize = doctype(depth + 1);</span> <span class='diff-add'> return state.tokenize(stream, state);</span> <span class='diff-add'> } else if (ch == ">") {</span> <span class='diff-add'> if (depth == 1) {</span> <span class='diff-add'> state.tokenize = inText;</span> <span class='diff-add'> break;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> state.tokenize = doctype(depth - 1);</span> <span class='diff-add'> return state.tokenize(stream, state);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> return "meta";</span> <span class='diff-add'> };</span> <span class='diff-add'> }</span> <span class='diff-add'> function Context(state, tagName, startOfLine) {</span> <span class='diff-add'> this.prev = state.context;</span> <span class='diff-add'> this.tagName = tagName;</span> <span class='diff-add'> this.indent = state.indented;</span> <span class='diff-add'> this.startOfLine = startOfLine;</span> <span class='diff-add'> if (Kludges.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))</span> <span class='diff-add'> this.noIndent = true;</span> <span class='diff-add'> }</span> <span class='diff-add'> function popContext(state) {</span> <span class='diff-add'> if (state.context) state.context = state.context.prev;</span> <span class='diff-add'> }</span> <span class='diff-add'> function maybePopContext(state, nextTagName) {</span> <span class='diff-add'> var parentTagName;</span> <span class='diff-add'> while (true) {</span> <span class='diff-add'> if (!state.context) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> parentTagName = state.context.tagName;</span> <span class='diff-add'> if (!Kludges.contextGrabbers.hasOwnProperty(parentTagName) ||</span> <span class='diff-add'> !Kludges.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) {</span> <span class='diff-add'> return;</span> <span class='diff-add'> }</span> <span class='diff-add'> popContext(state);</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function baseState(type, stream, state) {</span> <span class='diff-add'> if (type == "openTag") {</span> <span class='diff-add'> state.tagStart = stream.column();</span> <span class='diff-add'> return tagNameState;</span> <span class='diff-add'> } else if (type == "closeTag") {</span> <span class='diff-add'> return closeTagNameState;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> return baseState;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function tagNameState(type, stream, state) {</span> <span class='diff-add'> if (type == "word") {</span> <span class='diff-add'> state.tagName = stream.current();</span> <span class='diff-add'> setStyle = "tag";</span> <span class='diff-add'> return attrState;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> setStyle = "error";</span> <span class='diff-add'> return tagNameState;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function closeTagNameState(type, stream, state) {</span> <span class='diff-add'> if (type == "word") {</span> <span class='diff-add'> var tagName = stream.current();</span> <span class='diff-add'> if (state.context && state.context.tagName != tagName &&</span> <span class='diff-add'> Kludges.implicitlyClosed.hasOwnProperty(state.context.tagName))</span> <span class='diff-add'> popContext(state);</span> <span class='diff-add'> if (state.context && state.context.tagName == tagName) {</span> <span class='diff-add'> setStyle = "tag";</span> <span class='diff-add'> return closeState;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> setStyle = "tag error";</span> <span class='diff-add'> return closeStateErr;</span> <span class='diff-add'> }</span> <span class='diff-add'> } else {</span> <span class='diff-add'> setStyle = "error";</span> <span class='diff-add'> return closeStateErr;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> function closeState(type, _stream, state) {</span> <span class='diff-add'> if (type != "endTag") {</span> <span class='diff-add'> setStyle = "error";</span> <span class='diff-add'> return closeState;</span> <span class='diff-add'> }</span> <span class='diff-add'> popContext(state);</span> <span class='diff-add'> return baseState;</span> <span class='diff-add'> }</span> <span class='diff-add'> function closeStateErr(type, stream, state) {</span> <span class='diff-add'> setStyle = "error";</span> <span class='diff-add'> return closeState(type, stream, state);</span> <span class='diff-add'> }</span> <span class='diff-add'> function attrState(type, _stream, state) {</span> <span class='diff-add'> if (type == "word") {</span> <span class='diff-add'> setStyle = "attribute";</span> <span class='diff-add'> return attrEqState;</span> <span class='diff-add'> } else if (type == "endTag" || type == "selfcloseTag") {</span> <span class='diff-add'> var tagName = state.tagName, tagStart = state.tagStart;</span> <span class='diff-add'> state.tagName = state.tagStart = null;</span> <span class='diff-add'> if (type == "selfcloseTag" ||</span> <span class='diff-add'> Kludges.autoSelfClosers.hasOwnProperty(tagName)) {</span> <span class='diff-add'> maybePopContext(state, tagName);</span> <span class='diff-add'> } else {</span> <span class='diff-add'> maybePopContext(state, tagName);</span> <span class='diff-add'> state.context = new Context(state, tagName, tagStart == state.indented);</span> <span class='diff-add'> }</span> <span class='diff-add'> return baseState;</span> <span class='diff-add'> }</span> <span class='diff-add'> setStyle = "error";</span> <span class='diff-add'> return attrState;</span> <span class='diff-add'> }</span> <span class='diff-add'> function attrEqState(type, stream, state) {</span> <span class='diff-add'> if (type == "equals") return attrValueState;</span> <span class='diff-add'> if (!Kludges.allowMissing) setStyle = "error";</span> <span class='diff-add'> return attrState(type, stream, state);</span> <span class='diff-add'> }</span> <span class='diff-add'> function attrValueState(type, stream, state) {</span> <span class='diff-add'> if (type == "string") return attrContinuedState;</span> <span class='diff-add'> if (type == "word" && Kludges.allowUnquoted) {setStyle = "string"; return attrState;}</span> <span class='diff-add'> setStyle = "error";</span> <span class='diff-add'> return attrState(type, stream, state);</span> <span class='diff-add'> }</span> <span class='diff-add'> function attrContinuedState(type, stream, state) {</span> <span class='diff-add'> if (type == "string") return attrContinuedState;</span> <span class='diff-add'> return attrState(type, stream, state);</span> <span class='diff-add'> }</span> <span class='diff-add'> return {</span> <span class='diff-add'> startState: function() {</span> <span class='diff-add'> return {tokenize: inText,</span> <span class='diff-add'> state: baseState,</span> <span class='diff-add'> indented: 0,</span> <span class='diff-add'> tagName: null, tagStart: null,</span> <span class='diff-add'> context: null};</span> <span class='diff-add'> },</span> <span class='diff-add'> token: function(stream, state) {</span> <span class='diff-add'> if (!state.tagName && stream.sol())</span> <span class='diff-add'> state.indented = stream.indentation();</span> <span class='diff-add'> if (stream.eatSpace()) return null;</span> <span class='diff-add'> type = null;</span> <span class='diff-add'> var style = state.tokenize(stream, state);</span> <span class='diff-add'> if ((style || type) && style != "comment") {</span> <span class='diff-add'> setStyle = null;</span> <span class='diff-add'> state.state = state.state(type || style, stream, state);</span> <span class='diff-add'> if (setStyle)</span> <span class='diff-add'> style = setStyle == "error" ? style + " error" : setStyle;</span> <span class='diff-add'> }</span> <span class='diff-add'> return style;</span> <span class='diff-add'> },</span> <span class='diff-add'> indent: function(state, textAfter, fullLine) {</span> <span class='diff-add'> var context = state.context;</span> <span class='diff-add'> // Indent multi-line strings (e.g. css).</span> <span class='diff-add'> if (state.tokenize.isInAttribute) {</span> <span class='diff-add'> if (state.tagStart == state.indented)</span> <span class='diff-add'> return state.stringStartCol + 1;</span> <span class='diff-add'> else</span> <span class='diff-add'> return state.indented + indentUnit;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (context && context.noIndent) return CodeMirror.Pass;</span> <span class='diff-add'> if (state.tokenize != inTag && state.tokenize != inText)</span> <span class='diff-add'> return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0;</span> <span class='diff-add'> // Indent the starts of attribute names.</span> <span class='diff-add'> if (state.tagName) {</span> <span class='diff-add'> if (multilineTagIndentPastTag)</span> <span class='diff-add'> return state.tagStart + state.tagName.length + 2;</span> <span class='diff-add'> else</span> <span class='diff-add'> return state.tagStart + indentUnit * multilineTagIndentFactor;</span> <span class='diff-add'> }</span> <span class='diff-add'> if (alignCDATA && /<!\[CDATA\[/.test(textAfter)) return 0;</span> <span class='diff-add'> var tagAfter = textAfter && /^<(\/)?([\w_:\.-]*)/.exec(textAfter);</span> <span class='diff-add'> if (tagAfter && tagAfter[1]) { // Closing tag spotted</span> <span class='diff-add'> while (context) {</span> <span class='diff-add'> if (context.tagName == tagAfter[2]) {</span> <span class='diff-add'> context = context.prev;</span> <span class='diff-add'> break;</span> <span class='diff-add'> } else if (Kludges.implicitlyClosed.hasOwnProperty(context.tagName)) {</span> <span class='diff-add'> context = context.prev;</span> <span class='diff-add'> } else {</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> } else if (tagAfter) { // Opening tag spotted</span> <span class='diff-add'> while (context) {</span> <span class='diff-add'> var grabbers = Kludges.contextGrabbers[context.tagName];</span> <span class='diff-add'> if (grabbers && grabbers.hasOwnProperty(tagAfter[2]))</span> <span class='diff-add'> context = context.prev;</span> <span class='diff-add'> else</span> <span class='diff-add'> break;</span> <span class='diff-add'> }</span> <span class='diff-add'> }</span> <span class='diff-add'> while (context && !context.startOfLine)</span> <span class='diff-add'> context = context.prev;</span> <span class='diff-add'> if (context) return context.indent + indentUnit;</span> <span class='diff-add'> else return 0;</span> <span class='diff-add'> },</span> <span class='diff-add'> electricInput: /<\/[\s\w:]+>$/,</span> <span class='diff-add'> blockCommentStart: "<!--",</span> <span class='diff-add'> blockCommentEnd: "-->",</span> <span class='diff-add'> configuration: parserConfig.htmlMode ? "html" : "xml",</span> <span class='diff-add'> helperType: parserConfig.htmlMode ? "html" : "xml"</span> <span class='diff-add'> };</span> <span class='diff-add'>});</span> <span class='diff-add'>CodeMirror.defineMIME("text/xml", "xml");</span> <span class='diff-add'>CodeMirror.defineMIME("application/xml", "xml");</span> <span class='diff-add'>if (!CodeMirror.mimeModes.hasOwnProperty("text/html"))</span> <span class='diff-add'> CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true});</span> <span class='diff-add'>});</span> <span class='hidden' style='font-size:75%'>diff --git a/ipynb/analyses/hypo-hyper-overlap.xlsx b/ipynb/analyses/hypo-hyper-overlap.xlsx</span> <span class='hidden' style='font-size:75%'>index 2551a6f..f887f48 100644</span> Binary files a/ipynb/analyses/hypo-hyper-overlap.xlsx and b/ipynb/analyses/hypo-hyper-overlap.xlsx differ <span class='hidden' style='font-size:75%'>diff --git a/ipynb/scratch.ipynb b/ipynb/scratch.ipynb</span> <span class='hidden' style='font-size:75%'>index 6ebfab4..b97cb4d 100644</span> <span class='hidden' style='font-size:75%'>--- a/ipynb/scratch.ipynb</span> <span class='hidden' style='font-size:75%'>+++ b/ipynb/scratch.ipynb</span> <br><span class="hidden"> ... </span><br> {</span> <span class='diff-rem'>"metadata": {</span> <span class='diff-rem'> "name": "",</span> <span class='diff-rem'> "signature": "sha256:7be4f3553aafdb8e31c7929bb02e8cb8ad9796a1ffc611c8497433e0a976a1e0"</span> <span class='diff-rem'> },</span> <span class='diff-rem'> "nbformat": 3,</span> <span class='diff-rem'> "nbformat_minor": 0,</span> <span class='diff-rem'> "worksheets":</span> <span class='diff-add'>"cells":</span> [ {</span> <span class='diff-rem'>"cells": [</span> <span class='diff-rem'> {</span> "cell_type": "code", <span class='diff-rem'>"collapsed": false,</span> <span class='diff-rem'> "input": [</span> <span class='diff-rem'> "!head /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/*sig*"</span> <span class='diff-rem'> ],</span> <span class='diff-rem'> "language": "python",</span> <span class='diff-add'>"execution_count": 6,</span> "metadata":<span class='diff-rem'>{},</span> <span class='diff-rem'> "outputs": [</span> { <span class='diff-rem'>"output_type": "stream",</span> <span class='diff-rem'> "stream": "stdout",</span> <span class='diff-rem'> "text": [</span> <span class='diff-rem'> "==> /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.2M_sig.bedGraph <==\r\n",</span> <span class='diff-rem'> "track type=bedGraph name=\"2M_sig\" description=\"2M_sig\" visibility=full color=100,100,0 altColor=0,100,200 priority=20\r\n",</span> <span class='diff-rem'> "scaffold1\t163391\t163444\t-1.19635354862016\r\n",</span> <span class='diff-rem'> "scaffold1\t167390\t167448\t-1.34858424227208\r\n",</span> <span class='diff-rem'> "scaffold1\t177036\t177092\t-1.32513261026528\r\n",</span> <span class='diff-rem'> "scaffold1\t180263\t180313\t-1.59644601437398\r\n",</span> <span class='diff-rem'> "scaffold1\t184151\t184202\t-1.36802539236446\r\n",</span> <span class='diff-rem'> "scaffold1\t207852\t207911\t-1.4489540693628\r\n",</span> <span class='diff-rem'> "scaffold1\t221645\t221697\t-1.19168816975966\r\n",</span> <span class='diff-rem'> "scaffold100\t20261\t20311\t-1.38705592724581\r\n",</span> <span class='diff-rem'> "scaffold100\t43707\t43766\t-1.94554287545546\r\n",</span> <span class='diff-rem'> "\r\n",</span> <span class='diff-rem'> "==> /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.4M_sig.bedGraph <==\r\n",</span> <span class='diff-rem'> "track type=bedGraph name=\"4M_sig\" description=\"4M_sig\" visibility=full color=100,100,0 altColor=0,100,200 priority=20\r\n",</span> <span class='diff-rem'> "scaffold1\t55723\t55780\t-1.14983078196614\r\n",</span> <span class='diff-rem'> "scaffold1\t162896\t162952\t1.31051906307266\r\n",</span> <span class='diff-rem'> "scaffold1\t165162\t165215\t-1.24601772855566\r\n",</span> <span class='diff-rem'> "scaffold1\t171392\t171453\t-1.22260744814979\r\n",</span> <span class='diff-rem'> "scaffold1\t174020\t174073\t1.13065801555915\r\n",</span> <span class='diff-rem'> "scaffold1\t174287\t174343\t-1.69319890151177\r\n",</span> <span class='diff-rem'> "scaffold1\t176273\t176334\t-1.72785163633438\r\n",</span> <span class='diff-rem'> "scaffold1\t178210\t178267\t1.2199265031441\r\n",</span> <span class='diff-rem'> "scaffold1\t183256\t183318\t-1.30551922539134\r\n",</span> <span class='diff-rem'> "\r\n",</span> <span class='diff-rem'> "==> /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.6M_sig.bedGraph <==\r\n",</span> <span class='diff-rem'> "track type=bedGraph name=\"6M_sig\" description=\"6M_sig\" visibility=full color=100,100,0 altColor=0,100,200 priority=20\r\n",</span> <span class='diff-rem'> "scaffold1\t54599\t54654\t-1.38187662416007\r\n",</span> <span class='diff-rem'> "scaffold1\t162129\t162191\t1.85685479189849\r\n",</span> <span class='diff-rem'> "scaffold1\t163536\t163586\t-1.15032035523765\r\n",</span> <span class='diff-rem'> "scaffold1\t172654\t172714\t1.33561271440876\r\n",</span> <span class='diff-rem'> "scaffold1\t174287\t174343\t-1.62903936976887\r\n",</span> <span class='diff-rem'> "scaffold1\t178075\t178128\t1.42323539316231\r\n",</span> <span class='diff-rem'> "scaffold1\t178685\t178740\t1.30886296151914\r\n",</span> <span class='diff-rem'> "scaffold1\t184271\t184330\t-1.20699853451878\r\n",</span> <span class='diff-rem'> "scaffold1\t184661\t184715\t-1.61107459826899\r\n"</span> <span class='diff-rem'> ]</span> <span class='diff-rem'> }</span> <span class='diff-rem'> ],</span> <span class='diff-rem'> "prompt_number": 3</span> <span class='diff-add'>"collapsed": false</span> }, <span class='diff-add'>"outputs": [</span> {</span> <span class='diff-rem'>"cell_type": "code",</span> <span class='diff-rem'> "collapsed": false,</span> <span class='diff-rem'> "input": [</span> <span class='diff-rem'> "!sort /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/canonical/4M_3plusmerge_Hyper.bed"</span> <span class='diff-rem'> ],</span> <span class='diff-rem'> "language": "python",</span> <span class='diff-rem'> "metadata": {},</span> <span class='diff-rem'> "outputs": [</span> <span class='diff-rem'> {</span> <span class='diff-add'>"ename": "SyntaxError",</span> <span class='diff-add'> "evalue": "invalid syntax (<ipython-input-6-39d947ddb079>, line 2)",</span> "output_type": <span class='diff-rem'>"stream",</span> <span class='diff-rem'> "stream": "stdout",</span> <span class='diff-rem'> "text":</span> <span class='diff-add'>"error",</span> <span class='diff-add'> "traceback":</span> [ <span class='diff-rem'>"scaffold1241\t28111\t28419\r\n",</span> <span class='diff-rem'> "scaffold1447\t305772\t306206\r\n",</span> <span class='diff-rem'> "scaffold1805\t257176\t257496\r\n",</span> <span class='diff-rem'> "scaffold257\t1235165\t1235481\r\n",</span> <span class='diff-rem'> "scaffold40230\t41604\t41898\r\n",</span> <span class='diff-rem'> "scaffold41982\t74367\t74671\r\n",</span> <span class='diff-rem'> "scaffold63\t426683\t426993\r\n",</span> <span class='diff-rem'> "scaffold70\t774778\t775094\r\n",</span> <span class='diff-rem'> "scaffold801\t338037\t338345\r\n",</span> <span class='diff-rem'> "scaffold801\t339443\t339729\r\n"</span> <span class='diff-add'>"\u001b[0;36m File \u001b[0;32m\"<ipython-input-6-39d947ddb079>\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m ipython nbconvert --to FORMAT notebook.ipynb\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"</span> ] } ], <span class='diff-rem'>"prompt_number": 5</span> <span class='diff-add'>"source": [</span> <span class='diff-add'> "%bash\n",</span> <span class='diff-add'> "ipython nbconvert --to FORMAT notebook.ipynb"</span> <span class='diff-add'> ]</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "cell_type": "code",</span> <span class='diff-add'> "execution_count": 5,</span> <span class='diff-add'> "metadata": {</span> <span class='diff-add'> "collapsed": false</span> }, <span class='diff-add'>"outputs": [</span> {</span> <span class='diff-rem'>"cell_type": "code",</span> <span class='diff-rem'> "collapsed": false,</span> <span class='diff-rem'> "input": [],</span> <span class='diff-rem'> "language": "python",</span> <span class='diff-rem'> "metadata": {},</span> <span class='diff-rem'> "outputs": []</span> <span class='diff-add'>"name": "stdout",</span> <span class='diff-add'> "output_type": "stream",</span> <span class='diff-add'> "text": [</span> <span class='diff-add'> "scaffold1241\t28111\t28419\r\n",</span> <span class='diff-add'> "scaffold1447\t305772\t306206\r\n",</span> <span class='diff-add'> "scaffold1805\t257176\t257496\r\n",</span> <span class='diff-add'> "scaffold257\t1235165\t1235481\r\n",</span> <span class='diff-add'> "scaffold40230\t41604\t41898\r\n",</span> <span class='diff-add'> "scaffold41982\t74367\t74671\r\n",</span> <span class='diff-add'> "scaffold63\t426683\t426993\r\n",</span> <span class='diff-add'> "scaffold70\t774778\t775094\r\n",</span> <span class='diff-add'> "scaffold801\t338037\t338345\r\n",</span> <span class='diff-add'> "scaffold801\t339443\t339729\r\n"</span> <span class='diff-add'> ]</span> }</span> ],</span> <span class='diff-add'>"source": [</span> <span class='diff-add'> "!sort /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/canonical/4M_3plusmerge_Hyper.bed"</span> <span class='diff-add'> ]</span> <span class='diff-add'> },</span> <span class='diff-add'> {</span> <span class='diff-add'> "cell_type": "code",</span> <span class='diff-add'> "execution_count": null,</span> "metadata": <span class='diff-rem'>{}</span> <span class='diff-add'>{</span> <span class='diff-add'> "collapsed": false</span> <span class='diff-add'> },</span> <span class='diff-add'> "outputs": [],</span> <span class='diff-add'> "source": []</span> }</span> <span class='diff-rem'>]</span> <span class='diff-add'>],</span> <span class='diff-add'> "metadata": {</span> <span class='diff-add'> "kernelspec": {</span> <span class='diff-add'> "display_name": "Python 2",</span> <span class='diff-add'> "language": "python",</span> <span class='diff-add'> "name": "python2"</span> <span class='diff-add'> },</span> <span class='diff-add'> "language_info": {</span> <span class='diff-add'> "codemirror_mode": {</span> <span class='diff-add'> "name": "ipython",</span> <span class='diff-add'> "version": 2</span> <span class='diff-add'> },</span> <span class='diff-add'> "file_extension": ".py",</span> <span class='diff-add'> "mimetype": "text/x-python",</span> <span class='diff-add'> "name": "python",</span> <span class='diff-add'> "nbconvert_exporter": "python",</span> <span class='diff-add'> "pygments_lexer": "ipython2",</span> <span class='diff-add'> "version": "2.7.9"</span> <span class='diff-add'> }</span> <span class='diff-add'> },</span> <span class='diff-add'> "nbformat": 4,</span> <span class='diff-add'> "nbformat_minor": 0</span> } <span class='hidden' style='font-size:75%'>diff --git a/notes/hyper-splitting.md b/notes/hyper-splitting.md</span> <span class='hidden' style='font-size:75%'>new file mode 100644</span> <span class='hidden' style='font-size:75%'>index 0000000..e69de29</span>